2013-08-16 6 views
0

Предположим, например, у меня есть nd.array Numpy, который имеет форму (10,10):Маске массива Расчет на np.array

import numpy as np 
a = np.linspace(-1,1,100).reshape(10,10) 

я хотел бы выполнить расчет на первый элемент каждой строки тогда и только тогда, когда первый элемент меньше нуля. Чтобы сделать это, я думал об использовании замаскированную массива:

a = np.ma.MaskedArray(a,mask=(np.ones_like(a)*(a[:,0]<0)).T) 

>>> (np.ones_like(a)*(a[:,0]<0)).T 
array([[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
    [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
    [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
    [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
    [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

Это позволит мне выполнять расчеты только по строкам, в которых первый элемент меньше нуля (это просто так получилось, что в этом Например, другие элементы этих строк также отрицательны, но я проверил случай, когда только первые элементы отрицательные, а остальные положительные). У меня есть несколько вопросов на этом этапе:

1) Должен ли я добавить дополнительную маску для покрытия всех столбцов, кроме первой, чтобы выполнить мои вычисления (чтобы сделать конкретный пример: я хотел бы добавить 1000 к первому элемент каждой строки, где этот элемент меньше нуля)?

2) Маскирует массив постоянным? Есть ли способ маскировки?

3) Это самый простой способ выполнить этот тип расчета?

Любые предложения будут оценены. Благодаря!

+0

Вы хотите обновить массив inplace? –

+0

Да, это было бы идеально. – astromax

ответ

1

На мой взгляд, используя замаскированный массив кажется немного излишним для делать что-то относительно простое, как это. Я бы использовал причудливую индексацию numpy для этого:

#get indices of rows to update 
rowsToUpdate = np.nonzero(a[:,0]<0)[0] 
#increment first element of target rows by 1000 
a[rowsToUpdate,0] += 1000 
1

Вы можете сделать следующее с помощью pandas:

import numpy as np 
from pandas import DataFrame # DataFrame is the workhorse of pandas 

a = DataFrame(np.linspace(-1, 1, 100).reshape(10, 10)) 
mask = a[0] < 0 # a[0] is the 0th column of a 
suba = a[mask] 

# do some calcs with suba ... make sure the index remains the same 

a[mask] = suba 
Смежные вопросы