Разделите большую матрицу на маленькую, указав список индексов [duplicate]

Было опубликовано много хороших ответов, но я хотел бы добавить еще один.

Не все числа могут быть представлены с помощью float / double. Например, будет представлено число «0,2» как «0.200000003» в одинарной точности в стандарте по плавающей точке IEEE754.

Модель для хранения действительных чисел под капотом представляет собой число с плавающей запятой в качестве

Хотя вы можете легко ввести 0.2, FLT_RADIX и DBL_RADIX равно 2; не 10 для компьютера с FPU, который использует «Стандарт IEEE для двоичной арифметики с плавающей запятой (ISO / IEEE Std 754-1985)».

. Точно так же трудно точно представлять такие числа. Даже если вы укажете эту переменную явно без какого-либо промежуточного вычисления.

5
задан bordeo 24 February 2016 в 17:39
поделиться

4 ответа

Вы можете просто использовать np.ix_ для такого вещания, например:

x_indexed = x[np.ix_(row_indices,col_indices)]

Пример прогона -

In [221]: x
Out[221]: 
array([[17, 39, 88, 14, 73, 58, 17, 78],
       [88, 92, 46, 67, 44, 81, 17, 67],
       [31, 70, 47, 90, 52, 15, 24, 22],
       [19, 59, 98, 19, 52, 95, 88, 65],
       [85, 76, 56, 72, 43, 79, 53, 37],
       [74, 46, 95, 27, 81, 97, 93, 69],
       [49, 46, 12, 83, 15, 63, 20, 79]])

In [222]: row_indices
Out[222]: [4, 2, 5, 4, 1]

In [223]: col_indices
Out[223]: [1, 2]

In [224]: np.ix_(row_indices,col_indices) # Broadcasting of indices
Out[224]: 
(array([[4],
        [2],
        [5],
        [4],
        [1]]), array([[1, 2]]))

In [225]: x[np.ix_(row_indices,col_indices)]
Out[225]: 
array([[76, 56],
       [70, 47],
       [46, 95],
       [76, 56],
       [92, 46]])

As , предложенный OP , это действует так же, как передача старой школы с версией 2D-массива row_indices, которая имеет свои элементы / индексы отправленные до axis=0 и, таким образом, создавая одномерную размерность в axis=1 и, таким образом, позволяя вещание с col_indices. Таким образом, у нас было бы альтернативное решение, подобное этому -

In [227]: x[np.array(row_indices)[:,None],col_indices]
Out[227]: 
array([[76, 56],
       [70, 47],
       [46, 95],
       [76, 56],
       [92, 46]])
10
ответ дан Community 26 August 2018 в 07:53
поделиться

Как насчет:

x[row_indices][:,col_indices]

Например,

x = np.random.random_integers(0,5,(5,5))
## array([[4, 3, 2, 5, 0],
##        [0, 3, 1, 4, 2],
##        [4, 2, 0, 0, 3],
##        [4, 5, 5, 5, 0],
##        [1, 1, 5, 0, 2]])

row_indices = [4,2]
col_indices = [1,2]
x[row_indices][:,col_indices]
## array([[1, 5],
##        [2, 0]])
3
ответ дан Julien Spronck 26 August 2018 в 07:53
поделиться
2
ответ дан Mad Physicist 26 August 2018 в 07:53
поделиться
import numpy as np
x = np.random.random_integers(0,5,(4,4))
x
array([[5, 3, 3, 2],
       [4, 3, 0, 0],
       [1, 4, 5, 3],
       [0, 4, 3, 4]])

# This indexes the elements 1,1 and 2,2 and 3,3
indexes = (np.array([1,2,3]),np.array([1,2,3]))
x[indexes]
# returns array([3, 5, 4])

Обратите внимание, что numpy имеет очень разные правила в зависимости от того, какие индексы вы используете. Поэтому индексирование нескольких элементов должно выполняться с помощью tuple из np.ndarray (см. Руководство по индексированию ).

Поэтому вам нужно только преобразовать ваши list в np.ndarray и он должен работать, как ожидалось.

2
ответ дан MSeifert 26 August 2018 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: