Я столкнулся с этим взаимодействием с массивами, и я немного смущен. Я могу обойти это, но для моего собственного понимания я хотел бы знать, что происходит.
По сути, у меня есть файл данных, который я пытаюсь настроить, поэтому я могу запустить это как вход для некоторого кода, который я уже написал. Это связано с некоторыми вычислениями в некоторых столбцах, строках и т.д. В частности, мне также необходимо изменить некоторые элементы, где исходный массив не изменяется, как я ожидал.
import numpy as np
ex_data = np.arange(12).reshape(4,3)
ex_data[2,0] = 0 #Constructing some fake data
ex_data[ex_data[:,0] == 0][:,1] = 3
print ex_data
В принципе, я смотрю в столбце, представляющем интерес, собираю все строки, в которых этот столбец содержит интересующее значение параметра и просто переназначает значения.
С фрагментом кода выше я ожидал бы, что ex_data будет иметь один элемент столбца 1, условный, если элемент столбца 0 равен 0, которому будет присвоено значение 3. Однако то, что я вижу, это то, что на все.
>>> ex_data
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 0, 7, 8],
[ 9, 10, 11]])
В другом случае, если я не "нарезаю", мой "нарезанный" файл данных, то переназначение продолжается как обычно.
ex_data[ex_data[:,0] == 0] = 3
print ex_data
Здесь я ожидаю всю свою строку, условную, где столбец 0 равен 0, заполняется 3. Это то, что вы видите.
>>> ex_data
array([[ 3, 3, 3],
[ 3, 4, 5],
[ 3, 3, 3],
[ 9, 10, 11]])
Может ли кто-нибудь объяснить взаимодействие?
In [368]: ex_data
Out[368]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 0, 7, 8],
[ 9, 10, 11]])
Тест колонки 0:
In [369]: ex_data[:,0]==0
Out[369]: array([ True, False, True, False])
Эта логическая маска может быть применена к строкам как:
In [370]: ex_data[ex_data[:,0]==0,0]
Out[370]: array([0, 0]) # the 0 you expected
In [371]: ex_data[ex_data[:,0]==0,1]
Out[371]: array([1, 7]) # the col 1 values you want to replace
In [372]: ex_data[ex_data[:,0]==0,1] = 3
In [373]: ex_data
Out[373]:
array([[ 0, 3, 2],
[ 3, 4, 5],
[ 0, 3, 8],
[ 9, 10, 11]])
Индексирование, которое вы пытались:
In [374]: ex_data[ex_data[:,0]==0]
Out[374]:
array([[0, 3, 2],
[0, 3, 8]])
создает копию. Присвоение ...[:,1]=3
просто изменяет эту копию, а не исходный массив. К счастью, в этом случае он прост в использовании
ex_data[ex_data[:,0]==0,1]
вместо
ex_data[ex_data[:,0]==0][:,1]
ex_data[ex_data[:,0] == 0]
является расширенной индексацией, поэтому делает копию. Это не вид.