gpt4 book ai didi

python - 在 numpy 中多次通过引用进行 bool 切片

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:01 24 4
gpt4 key购买 nike

我想根据一些 bool 条件(级联,一个接一个)更改多维 numpy 数组(比如 mydata)。

这个有效:

mydata[condition] = something

这不是:

mydata[condition1][condition2] = something

所有条件都是兼容形状的 bool 数组(可广播)。为什么这没有什么原因,什么可能是一个好的解决方案?现在,我通过以下方式重新分配给原始文件来解决它:

tempdata = mydata[condition1]
tempdata[condition2] = something
mydata[condition1] = tempdata

最佳答案

要解决此类情况,请使用链接/级联 integer-indexing -

idx1 = np.flatnonzero(condition1)
idx2 = np.flatnonzero(condition2)
mydata[idx1[idx2]] = something

sample 运行-

In [42]: mydata = np.array([2,6,8,0,9,3,1,4])
...: mydata_copy = mydata.copy() # make copy for verification
...: condition1 = np.array([True,False,True,True,True,False,False,True])
...: condition2 = np.array([False,True,False,True,True])
...: something = -1
...:

# Working solution from question
In [43]: tempdata = mydata[condition1]
...: tempdata[condition2] = something
...: mydata[condition1] = tempdata
...:

In [44]: mydata # Check changed values
Out[44]: array([ 2, 6, -1, 0, -1, 3, 1, -1])

# Proposed solution
In [45]: idx1 = np.flatnonzero(condition1)
...: idx2 = np.flatnonzero(condition2)
...: mydata_copy[idx1[idx2]] = something
...:

In [46]: mydata_copy # Verify changed values in copy
Out[46]: array([ 2, 6, -1, 0, -1, 3, 1, -1])

替代方法: 或者,如果您不介意编辑 condition1,您可以这样做 -

condition1[idx1] = condition2

然后使用 mydata[condition1] = something 作为最后一步。


性能优势

让我们对提议的时间进行计时,看看与问题中的那个相比是否有任何好处。

方法-

# Original approach
def org_app(mydata,condition1,condition2):
tempdata = mydata[condition1]
tempdata[condition2] = something
mydata[condition1] = tempdata
return mydata

# Proposed one
def proposed_app(mydata,condition1,condition2):
idx1 = np.flatnonzero(condition1)
idx2 = np.flatnonzero(condition2)
mydata[idx1[idx2]] = something
return mydata

时间 -

In [58]: mydata = np.random.rand(1000000)
...: mydata_copy = mydata.copy()
...: condition1 = np.random.rand(mydata.size)>0.5
...: condition2 = np.random.rand(condition1.sum())>0.5
...: something = -1
...:

In [59]: %timeit org_app(mydata,condition1,condition2)
100 loops, best of 3: 14.1 ms per loop

In [61]: %timeit proposed_app(mydata_copy,condition1,condition2)
100 loops, best of 3: 7.44 ms per loop

合并替代方法应该会带来进一步的性能提升。

关于python - 在 numpy 中多次通过引用进行 bool 切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45146074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com