我有一个数组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. ])