首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >索引两个数组时的Numpy向量化

索引两个数组时的Numpy向量化
EN

Stack Overflow用户
提问于 2016-03-28 16:17:41
回答 2查看 641关注 0票数 0

我正在尝试使用numpy来向量化下面的函数,结果完全丢失了。

代码语言:javascript
运行
复制
A = ndarray: Z x 3

B = ndarray: Z x 3

C = integer

D = ndarray: C x 3

伪码:

代码语言:javascript
运行
复制
entries = []
means = []
For i in range(C):
    for p in range(len(B)):
        if B[p] == D[i]:
            entries.append(A[p])
    means.append(columnwise_means(entries))
return means

一个例子是:

代码语言:javascript
运行
复制
A = [[1,2,3],[1,2,3],[4,5,6],[4,5,6]]
B = [[9,8,7],[7,6,5],[1,2,3],[3,4,5]]
C = 2
D = [[1,2,3],[4,5,6]]

返回:

代码语言:javascript
运行
复制
[average([9,8,7],[7,6,5]), average(([1,2,3],[3,4,5])] = [[8,7,6],[2,3,4]]

我试过使用np.where、np.argwhere、np.mean等,但似乎没有达到预期的效果。任何帮助都将不胜感激。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 17:25:39

按照问题的预期输出,我假设在实际代码中,您应该有:

  • 如果条件语句为:if A[p] == D[i],和
  • 条目将从B:entries.append(B[p])中追加。

所以,这里有一个用NumPy broadcastingdot-product进行矢量化的方法-

代码语言:javascript
运行
复制
mask = (D[:,None,:] == A).all(-1)
out = mask.dot(B)/(mask.sum(1)[:,None])

如果输入数组是整数数组,则可以节省内存并提高性能,将数组视为n维数组的索引,从而创建2D mask而不像3D那样-

代码语言:javascript
运行
复制
dims = np.maximum(A.max(0),D.max(0))+1
mask = np.ravel_multi_index(D.T,dims)[:,None] == np.ravel_multi_index(A.T,dims)

样本运行-

代码语言:javascript
运行
复制
In [107]: A
Out[107]: 
array([[1, 2, 3],
       [1, 2, 3],
       [4, 5, 6],
       [4, 5, 6]])

In [108]: B
Out[108]: 
array([[9, 8, 7],
       [7, 6, 5],
       [1, 2, 3],
       [3, 4, 5]])

In [109]: mask = (D[:,None,:] == A).all(-1)
     ...: out = mask.dot(B)/(mask.sum(1)[:,None])
     ...: 

In [110]: out
Out[110]: 
array([[8, 7, 6],
       [2, 3, 4]])
票数 1
EN

Stack Overflow用户

发布于 2016-03-28 17:14:11

我看到两个提示:

首先,逐行比较数组。这样做的一种方法是简化1D中的索引系统:

代码语言:javascript
运行
复制
def indexer(M,base=256):
    return (M*base**arange(3)).sum(axis=1)

基数是整数> A.max()。然后选择就可以这样做:

代码语言:javascript
运行
复制
indices=np.equal.outer(indexer(D),indexer(A))

适用于:

代码语言:javascript
运行
复制
array([[ True,  True, False, False],
       [False, False,  True,  True]], dtype=bool)

第二,每个组都有不同的长度,因此最后一步的矢量化是困难的。这里是完成这份工作的方法。

代码语言:javascript
运行
复制
B=array(B)
means=[B[i].mean(axis=0) for  i in indices]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36266295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档