Несоответствие формы Значение Ошибка при попытке заполнить всю строку / столбец определенным значением - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь сделать следующее: у меня есть трехмерный массив X формы (Z, M, N). У меня есть отдельный одномерный массив Y формы (M), содержащий целочисленные значения, где значения больше 0 представляют строки в X, для которых я хочу установить соответствующее значение в Y. Например, см. Следующие сценарии:

X =
[[[0. 0.]
  [0. 0.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]]
Y =
[0 1]

должен вернуть:

[[[0. 0.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]]

или когда Y = [0 0], должно возвращаться:

[[[0. 0.]
  [0. 0.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]]

Следующий код работает для первого сценария, но вызывает следующую ошибку во втором сценарии, которую я не могу решить. Я использую Python 3.6.8 в Windows 10 Pro.

Traceback (most recent call last):
  File "blah2.py", line 41, in <module>
    r[np.where(y>0), :] = y[np.where(y>0)]
ValueError: shape mismatch: value array of shape (0,) could not be broadcast to indexing result of shape (1,0,2)
import numpy as np
x = np.ones((5, 2, 2))
y = np.array([0, 0])

r = np.zeros((2,2))
r[np.where(y>0), :] = y[np.where(y>0)]
x[0] = r
print(x)

1 Ответ

2 голосов
/ 29 марта 2019

Вам нужно расширить индексированный y до 2D, а затем назначить его, чтобы он стал транслируемым по отношению к индексированному x -

x[0,np.where(y>0),:] = y[np.where(y>0),None]

Или лучшим способом было бы просто использоватьmask и присваивайте при расширении индексированного y до 2D -

m = y>0 # get mask of comparisons
x[0,m,:] = y[m,None]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...