Нарезанный массив NumPy не изменяет исходный массив

1

Я столкнулся с этим взаимодействием с массивами, и я немного смущен. Я могу обойти это, но для моего собственного понимания я хотел бы знать, что происходит.

По сути, у меня есть файл данных, который я пытаюсь настроить, поэтому я могу запустить это как вход для некоторого кода, который я уже написал. Это связано с некоторыми вычислениями в некоторых столбцах, строках и т.д. В частности, мне также необходимо изменить некоторые элементы, где исходный массив не изменяется, как я ожидал.

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]])

Может ли кто-нибудь объяснить взаимодействие?

  • 0
    ex_data[ex_data[:,0] == 0] является расширенной индексацией, поэтому делает копию. Это не вид.
  • 0
    Каким будет ваш обходной путь @hpaulj?
Показать ещё 1 комментарий
Теги:
arrays
numpy

1 ответ

3
Лучший ответ
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]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню