2013-09-12 5 views
2

у меня есть:Заполните столбец Numpy массива с другим массивом

x = np.zeros((96,11,11,2,10),dtype=np.float64) 
y = np.array([0,10,20,30,40,50,60,70,80,90,100],dtype=np.float64) 
x[:,:,:,0,0] = y 
print x[0,:,:,0,0] 

я получаю:

[[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.] 
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]] 

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

Любые предложения?

+0

Это ваш фактический пример? Поскольку я не вижу, как вы можете назначить 1D-массив 3D-фрагменту, и когда я попробую его, как и ожидалось, 'x [:,:,:,, 0,0] = y' reises' ValueError: операнды не могут транслироваться вместе с фигурами (20,11,11) (10) '. – abarnert

+0

нет, его нет. Теперь я отредактирую его сейчас – Sammy

+0

Теперь его реальный пример – Sammy

ответ

2

Если вы хотите, чтобы вывод будет транспонирование, просто сделать:

>>> import numpy as np 
>>> x = np.zeros((96,11,11,2,10),dtype=np.float64) 
>>> y = np.array([0,10,20,30,40,50,60,70,80,90,100],dtype=np.float64) 
>>> for i in range(x.shape[0]): 
>>> x[i,:,:,0,0] = x[i,:,:,0,0].T 
>>> print x[0,:,:,0,0] 
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
    [ 10. 10. 10. 10. 10. 10. 10. 10. 10. 10. 10.] 
    [ 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20.] 
    [ 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30.] 
    [ 40. 40. 40. 40. 40. 40. 40. 40. 40. 40. 40.] 
    [ 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50.] 
    [ 60. 60. 60. 60. 60. 60. 60. 60. 60. 60. 60.] 
    [ 70. 70. 70. 70. 70. 70. 70. 70. 70. 70. 70.] 
    [ 80. 80. 80. 80. 80. 80. 80. 80. 80. 80. 80.] 
    [ 90. 90. 90. 90. 90. 90. 90. 90. 90. 90. 90.] 
    [ 100. 100. 100. 100. 100. 100. 100. 100. 100. 100. 100.]] 

Он обновляет первое измерение, это выход для 34-я индекса:

>>> print x[34,:,:,0,0] 
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
    [ 10. 10. 10. 10. 10. 10. 10. 10. 10. 10. 10.] 
    [ 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20.] 
    [ 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30.] 
    [ 40. 40. 40. 40. 40. 40. 40. 40. 40. 40. 40.] 
    [ 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50.] 
    [ 60. 60. 60. 60. 60. 60. 60. 60. 60. 60. 60.] 
    [ 70. 70. 70. 70. 70. 70. 70. 70. 70. 70. 70.] 
    [ 80. 80. 80. 80. 80. 80. 80. 80. 80. 80. 80.] 
    [ 90. 90. 90. 90. 90. 90. 90. 90. 90. 90. 90.] 
    [ 100. 100. 100. 100. 100. 100. 100. 100. 100. 100. 100.]] 
+0

Извините за мою запутанную формулировку. Я действительно хочу, чтобы результат выглядел как транспонирование этого (не хочу фактического транспонирования) – Sammy

+0

ОК, посмотрите сейчас, вам нужно только перевести 'x [0,:,:, 0,0] .T' на 'x [0,:,:, 0,0]' – jabaldonedo

+0

Моя точка в том, что я хочу x [1,:,:, 0,0], x [2,:,:, 0,0], x [3 ,:,:, 0,0] ..... x [95,:,:, 0,0], чтобы выглядеть так. так что я ищу что-то в том, как я изначально пишу x – Sammy

2

Вы должны изменить y от 1D до 2D (с одной колонки):

x[:,:,:,0,0] = y[:, np.newaxis] 

или

x[:,:,:,0,0] = y.reshape(11,1) 
0

Проблема проста: вы используете вектор строки для y вместо вектора-столбца, так что это заполнение по строкам, а не по столбцам.

Более технически у вас есть массив формы (11,), а не массив (11, 1), поэтому он транслирует до (1, 11) при заполнении 2D-массива.

Сравнить:

>>> x = np.zeros((96,11,11,2,10),dtype=np.float64) 
>>> y = np.array([[0],[10],[20],[30],[40],[50],[60],[70],[80],[90],[100]],dtype=np.float64) 
>>> x[:,:,:,0,0]=y 
>>> print x[0,:,:,0,0] 
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 10. 10. 10. 10. 10. 10. 10. 10. 10. 10. 10.] 
[ 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20.] 
[ 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30.] 
[ 40. 40. 40. 40. 40. 40. 40. 40. 40. 40. 40.] 
[ 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50.] 
[ 60. 60. 60. 60. 60. 60. 60. 60. 60. 60. 60.] 
[ 70. 70. 70. 70. 70. 70. 70. 70. 70. 70. 70.] 
[ 80. 80. 80. 80. 80. 80. 80. 80. 80. 80. 80.] 
[ 90. 90. 90. 90. 90. 90. 90. 90. 90. 90. 90.] 
[ 100. 100. 100. 100. 100. 100. 100. 100. 100. 100. 100.]] 

Конечно, в вашем реальном коде, y вероятно, не является буквальным, а результат некоторых более ранних вычислений. (И даже если это буква, вы не хотите набирать все эти дополнительные скобки.) Итак, предположим, что y по сути является вектором строк, так как мы имеем дело с ним.

Так, просто изменить его на лету:

>>> x = np.zeros((96,11,11,2,10),dtype=np.float64) 
>>> y = np.array([0,10,20,30,40,50,60,70,80,90,100],dtype=np.float64) 
>>> x[:,:,:,0,0] = y.reshape((11, 1)) 

Тот же результат.

Смежные вопросы