对不起,关于标题,我会寻找一个建议,如果有人有更好的描述。我需要一个函数(尽可能快)来获取非零的条目,并用前一个数组的有序版本填充一个新数组。下面的例子可能更清楚:
输入数组
np.random.seed(2)
a = np.random.randint(0,10,10)
b = np.random.randint(0,10,10)
c = np.random.randint(0,10,10)
a = 0 * (a % 2) + (1-(a % 2))*a
b = 0 * (b % 2) + (1-(b % 2))*b
c = 0 * (c % 2) + (1-(c % 2))*c
arr = np.array([a,b,c])
arr
>>> array([[8, 8, 6, 2, 8, 0, 2, 0, 0, 4],
[4, 0, 0, 0, 6, 4, 0, 0, 6, 0],
[0, 0, 8, 4, 6, 0, 0, 2, 0, 4]])
输出数组
outArr = np.empty_like(arr)
outArr[0,:] = (arr[0,:] > 0) * arr[0,:] + ~(arr[0,:] > 0) * (arr[1,:] > 0) * arr[1,:] + ~(arr[0,:] > 0) * ~(arr[1,:] > 0) * arr[2,:]
outArr[1,:] = (arr[0,:] > 0) * arr[1,:] + (arr[0,:] > 0) * ~(arr[1,:] > 0) * arr[2,:]
outArr[2,:] = (arr[0,:] > 0) * (arr[1,:] > 0) * arr[2,:]
outArr
>>> array([[8, 8, 6, 2, 8, 4, 2, 2, 6, 4],
[4, 0, 8, 4, 6, 0, 0, 0, 0, 4],
[0, 0, 0, 0, 6, 0, 0, 0, 0, 0]])
我把这个数组硬编码为3行,这样我就可以手工输入函数,实际上这可以是更多的行(按十的顺序,没什么太疯狂的)。你知道吗
编辑:
我实际上想要使用的尺寸是5行x 100-150k列
数据类型将始终是整数
最后,更新过程是在底部添加一个新行,向上对齐,然后删除所有只有0的尾随行(空值)
进近#1
受^{} 的启发,这里有一个针对
up-justification
和排序可能会减慢速度的情况进行了微调,因此可以建议使用broadcasted-mask-creation
的替代方法-样本运行-
进近#2
我们还可以将使用循环的工作卸载到
numba
,以提高in-situ
编辑的性能-大数组上的计时-
相关问题 更多 >
编程相关推荐