Почему индексирование массива numpy с использованием массива меняет форму? - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь индексировать двумерный массив для определенных значений, используя numpy .where (), но если я не индексирую в первом индексе без среза :, это всегда увеличивает размерность. Я не могу найти объяснение этому в документации.

Например, скажем, у меня есть массив a:

a = np.arange(20)
a = np.reshape(a,(4,5))
print("a = ",a)
print("a shape = ", a.shape)

Вывод:

a =  [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
a shape =  (4, 5)

Если у меня есть два индексных массива, один в направлении 'x' и один в направлении 'y':

x = np.arange(5)
y = np.arange(4)
xindx = np.where((x>=2)&(x<=4))
yindx = np.where((y>=1)&(y<=2))

, а затем индексируйте a, используя индекс 'y', так что есть нет проблем:

print(a[yindx])
print(a[yindx].shape)

Вывод:

[[ 5  6  7  8  9]
 [10 11 12 13 14]]
(2, 5)

Но если у меня есть : в одном из индексов, тогда у меня есть дополнительное измерение размера 1:

print(a[yindx,:])
print(a[yindx,:].shape)
print(a[:,xindx])
print(a[:,xindx].shape)

Вывод:

[[[ 5  6  7  8  9]
  [10 11 12 13 14]]]
(1, 2, 5)
[[[ 2  3  4]]
 [[ 7  8  9]]
 [[12 13 14]]
 [[17 18 19]]]
(4, 1, 3)

Я столкнулся с этой проблемой и с одномерными массивами. Как я могу это исправить?

1 Ответ

0 голосов
/ 27 апреля 2020

Если бы xindx и yindx были numpy массивами, результат был бы таким, как ожидалось. Тем не менее, они являются кортежами с одним значением.

Самое простое (и довольно глупое) исправление:

xindx = np.where((x>=2)&(x<=4))[0]
yindx = np.where((y>=1)&(y<=2))[0]

С учетом только данного условия np.where будет возвращать индексы соответствующих элементов в кортеж. Это использование явно не рекомендуется в документации .

Более реалистично, вам, вероятно, нужно что-то вроде:

xindx = np.arange(2, 5)
yindx = np.arange(1, 3)

... но это действительно зависит от контекста, который мы не вижу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...