【发布时间】:2019-10-29 14:07:05
【问题描述】:
我有两个相同形状的 numpy 数组:dat_ara 和 ref_ara。
我想对axis = -1 的dat_ara 执行操作op_func,但是我只想对每个数组中的选定值切片进行操作,当阈值thres 为时指定切片被引用数组ref_ara交叉。
为了说明,在数组只是 2-dim 的简单情况下,我有:
thres = 4
op_func = np.average
ref_ara = array([[1, 2, 1, 4, 3, 5, 1, 5, 2, 5],
[1, 2, 2, 1, 1, 1, 2, 7, 5, 8],
[2, 3, 2, 5, 1, 6, 5, 2, 7, 3]])
dat_ara = array([[1, 0, 0, 1, 1, 1, 1, 0, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 1, 0],
[1, 0, 1, 1, 1, 1, 0, 1, 1, 1]])
我们看到thres 在ref_ara 的axis=0 的第一个、第二个和第三个数组的第5 个、第7 个和第3 个索引中被破坏。因此我想要的结果是
out_ara = array([op_func(array([1, 0, 0, 1, 1, 1]),
op_func(array([1, 1, 1, 1, 1, 1, 1, 0]),
op_func(array([1, 0, 1, 1])])
这个问题很困难,因为它需要引用ref_ara。如果不是这样,我可以简单地使用numpy.apply_along_axis。
我已经尝试扩展两个数组的维度以将它们关联起来进行计算,即:
assos_ara = np.append(np.expand_dims(dat_ara, axis=-1), np.expand_dims(ref_ara, axis=-1), axis=-1)
但同样,numpy.apply_along_axis 要求输入函数只能对 1-dim 数组进行操作,因此我仍然无法使用该函数。
我知道的唯一另一种方法是按索引迭代数组,但是,由于数组的两个数组的维数不断变化,这是一个棘手的问题,而且计算效率不高。
我很想使用矢量化函数来帮助这个过程。最有效的方法是什么?
【问题讨论】:
-
今天是你的幸运日。我刚刚问过这个:stackoverflow.com/q/58595650/2988730
-
不错!这个问题确实看起来很相似,需要一些时间来消化代码..
-
这是您需要的构建块之一。我正在给你写一个答案。
标签: python arrays numpy vectorization