首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向外压缩numpy码

向外压缩numpy码
EN

Stack Overflow用户
提问于 2018-06-14 15:07:19
回答 1查看 112关注 0票数 1

我试着把下面的代码矢量化-

代码语言:javascript
复制
for i in range(imL.shape[0]):
    for j in range(imL.shape[1]):
        if j - disp[i][j] >= 0:
            imR[i, j - disp[i][j], :] = imL[i, j, :]

基本上,我想这么做-

代码语言:javascript
复制
A[i, j - B[i, j], k] = C[i, j, k] for all (i, j, k)

我查过布尔索引,想出了这个-

代码语言:javascript
复制
tmp = np.arange(imR.shape[1])
tmp = np.repeat(tmp[np.newaxis, :], imR.shape[0], axis=0)
tmp = np.repeat(tmp[:, :, np.newaxis], imR.shape[2], axis=2)

imR[(tmp - disp) >= 0] = imL

但是,这会抛出错误-

代码语言:javascript
复制
TypeError: NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 3 dimensions

我相信整数索引是解决方案,然而,我不能想出任何东西。有没有一种有效的向量化方法?

注: imL和imR为NxMx3。disp是一个N ndarray。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-14 15:58:35

可以使用np.indices简化临时索引数组的创建。

代码语言:javascript
复制
i_indices, j_indices = np.indices(disp.shape)

然后可以使用自定义公式创建更新的索引数组:

代码语言:javascript
复制
# j - B[i, k]
new_j_ind = j_indices - disp

在以下条件下,用原始的j值替换更新的j值:

代码语言:javascript
复制
# if j - disp[i][j] < 0, keep original j index
new_j_ind[new_j_ind < 0] = j_indices[new_j_ind < 0]

然后写数组。

代码语言:javascript
复制
# A[i, j - B[i, j] if j - B[i, j] > 0 else j, k] = C[i, j, k] for all (i, j, k)
imR[i_indices, new_j_ind] = imL

但是要小心:如果[i, j - B[i, j]]对任何(i,k)都映射到相同的坐标,这是没有很好定义的。在for循环中,它定义得很好(最后写的值获胜),在numpy向量化代码中则不是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50860635

复制
相关文章

相似问题

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