用不同数组B的值更新数组A中的非零值,该数组的大小等于A中非零值的数量

  • 本文关键字:数组 非零值 小等 更新 python arrays numpy
  • 更新时间 :
  • 英文 :


我有一个数组A。它的长度可能不同,但总是用1和/或0填充。

A = np.array([1,0,1,0])

A被传递到生成数组B的函数中。

B = np.array([0.75, 0.25])

B的长度总是等于A中1的数量。

如何最有效地更新等于的A(或创建新阵列(

[0.75, 0, 0.25, 0]

在这个例子中?我希望它能与任何大小的数组A一起工作,满足我上面为B制定的约束条件。B的第一个值总是A中的第一个1,依此类推

我通过将它们转换为列表并循环来实现它

pos = 0
for i in range(len(a)):
if a[i] == 1:
a[i] = b[pos]
pos += 1

但我希望有一个更好的解决方案,因为我必须经常这样做,a和B可能会更大。

In [1]: A = np.array([1,0,1,0])

首先要识别非零元素。有几种方法:

In [2]: A.astype(bool)
Out[2]: array([ True, False,  True, False])
In [3]: A>0
Out[3]: array([ True, False,  True, False])
In [4]: np.nonzero(A)
Out[4]: (array([0, 2]),)

这些元素中的任何一个都可以用于选择那些元素;用于获取和设置:

In [5]: A[np.nonzero(A)]
Out[5]: array([1, 1])
In [6]: A[np.nonzero(A)] = [2,3]
In [7]: A
Out[7]: array([2, 0, 3, 0])
In [8]: A[[0,2]]
Out[8]: array([2, 3])

但是,如果我们试图分配两个浮点值,它们会被截断:

In [9]: A[[0,2]] = [.25, .75]
In [10]: A
Out[10]: array([0, 0, 0, 0])

A需要是浮点数据类型:

In [11]: A1=A.astype(float)
In [12]: A1[[0,2]] = [.25, .75]
In [13]: A1
Out[13]: array([0.25, 0.  , 0.75, 0.  ])

最新更新