0

例如,假设我有一个形状为 (10,10) 的 Numpy nd.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)这是执行此类计算的最简单方法吗?

任何建议,将不胜感激。谢谢!

4

2 回答 2

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
于 2013-08-17T01:10:19.160 回答
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
于 2013-08-17T06:52:04.787 回答