2016-11-13 2 views
0

Я пытаюсь проиндексировать некоторую матрицу, y, а затем повторно проиндексировать этот результат с помощью некоторого булевого оператора и установить соответствующие элементы в y на 0. Ниже приведен фиктивный код, который я использую для проверки этой схемы индексирования.Установка значений массива Numpy при индексировании индексированного массива

x=np.zeros([5,4])+0.1; 
y=x; 
print(x) 
m=np.array([0,2,3]); 
y[0:4,m][y[0:4,m]<0.5]=0; 
print(y) 

Я не уверен, почему это не работает. Выход я хочу:

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

Но то, что я на самом деле получить:

[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 
[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 

Я уверен, что не хватает некоторых под капотом детали, объясняет, почему это не работает. Интересно, что если вы замените m на :, тогда работа будет выполнена. По какой-то причине выбор подмножества столбцов не позволяет мне присваивать нули.

Если кто-то может объяснить, что происходит, и помочь мне найти альтернативное решение (надеюсь, что это не связано с созданием временного массива numpy, так как мой фактический y будет действительно огромным), я был бы очень признателен! Спасибо!

EDIT: y[0:4,:][y[0:4,:]<0.5]=0; y[0:4,0:3][y[0:4,0:3]<0.5]=0; т.д.

все работы, как и ожидалось. Кажется, проблема заключается в том, что вы индексируете список какого-то рода.

+0

Не могли бы вы использовать некоторые случайные числа, а не все '0,1', что-то вроде' np.random.rand (5,4) 'в качестве ввода и показать нам ожидаемый результат? – Divakar

+0

Первоначально я тестировался со всеми случайными числами, где я впервые столкнулся с проблемой. Я переключился на все «0,1» только потому, что был более воспроизводимым. –

+0

Вы можете использовать 'np.random.seed (1234)' в начале, чтобы иметь воспроизводимые случайные числа. – Divakar

ответ

0

Сделать массив (это один из моих любимых, потому что значения отличаются):

In [845]: x=np.arange(12).reshape(3,4) 
In [846]: x 
Out[846]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In [847]: m=np.array([0,2,3]) 
In [848]: x[:,m] 
Out[848]: 
array([[ 0, 2, 3], 
     [ 4, 6, 7], 
     [ 8, 10, 11]]) 
In [849]: x[:,m][:2,:]=0 
In [850]: x 
Out[850]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

Без изменений. Но если я сделаю индексацию за один шаг, это изменится.

In [851]: x[:2,m]=0 
In [852]: x 
Out[852]: 
array([[ 0, 1, 0, 0], 
     [ 0, 5, 0, 0], 
     [ 8, 9, 10, 11]]) 

он также работает, если я в обратном порядке:

In [853]: x[:2,:][:,m]=10 
In [854]: x 
Out[854]: 
array([[10, 1, 10, 10], 
     [10, 5, 10, 10], 
     [ 8, 9, 10, 11]]) 

x[i,j] выполняется в x.__getitem__((i,j)). x[i,j]=v как x.__setitem__((i,j),v).

x[i,j][k,l]=v является x.__getitem__((i,j)).__setitem__((k,l),v).

set относится к значению, произведенному get. Если get возвращает вид, то изменение влияет на x. Но если он создает копию, это изменение не влияет на x.

С массивом m, y[0:4,m] создает копию (мне нужно это продемонстрировать?). y[0:4,:] создает вид.

Итак, если первая индексация создает представление, второе работает с индексированным присваиванием. Но если вы создаете копию, вторая не имеет эффекта.

+0

Это имеет смысл, спасибо. В моем случае, можно ли делать то, что я хочу, на одном этапе индексирования? –

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