python - 使用另一个二维数组的索引提取二维数组的元素

标签 python arrays numpy

我有一个二维 numpy 数组:data.shape==(n,8) 和另一个 ind.shape=(n,4)。 ind 数组的长度与 data 相同,并且包含类似 [4,3,0,6] 的索引。如何创建另一个 shape==(n,4) 的数组,其中包含来自 ind 的索引指定的数据中的元素?我的实际数组很长 (shape[0]),所以循环很慢。一定有比循环更好的方法吗?

import numpy as np
# Example data
data = np.array([[ 0.44180102, -0.05941365,  2.1482739 , -0.56875081, -1.45400572,
        -1.44391254, -0.33710766, -0.44214518],
       [ 0.79506417, -2.46156966, -0.09929341, -1.07347179,  1.03986533,
        -0.45745476,  0.58853107, -1.08565425],
       [ 1.40348682, -1.43396403,  0.8267174 , -1.54812358, -1.05854445,
         0.15789466, -0.0666025 ,  0.29058816]])
ind = np.array([[3, 4, 1, 5],
                [4, 7, 0, 1],
                [5, 1, 3, 6]])

# This is the part I want to vectorize:
out = np.zeros(ind.shape)
for i in range(ind.shape[0]):
    out[i,:] = data[i,ind[i,:]]

# This should be good
assert np.all(out == np.array([[-0.56875081, -1.45400572, -0.05941365, -1.44391254],
                        [ 1.03986533, -1.08565425,  0.79506417, -2.46156966],
                        [ 0.15789466, -1.43396403, -1.54812358, -0.0666025 ]]))

最佳答案

如果我们索引到拼凑的 data 数组,这可以很容易地完成:

out = data.ravel()[ind.ravel() + np.repeat(range(0, 8*ind.shape[0], 8), ind.shape[1])].reshape(ind.shape)

说明

分解成三个步骤可能更容易理解:

indices = ind.ravel() + np.repeat(range(0, 8*ind.shape[0], 8), ind.shape[1])
out = data.ravel()[indices]
out = out.reshape(ind.shape)

ind 包含我们想要的 data 中的元素信息。不幸的是,它以二维指数表示。上面的第一行将这些转换为一维 dataindices。上面的第二行从拼凑的数组 data 中选择那些元素。第三行将二维形状恢复为 outind 表示的二维索引被转换为 indindices 有索引

关于python - 使用另一个二维数组的索引提取二维数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25277092/

相关文章:

python - 使用多个条件选择行

android - 如何在 Android 中读取 JSON 父标签

python - 在 Python 中构建随机集群的更 Pythonic 方式

python - 当数据重复时如何用 pandas 或 numpy 数组检测下降?

python - 在没有 for 循环的情况下基于另外两个系列填充一个系列

python - 使用 python 多重处理进行 sklearn NN

python - 如何过滤 Django 对象以接受匹配项和 NULL?

php - 在没有大括号和分号的情况下,如何编写可读的 Python 代码?

arrays - 尝试在 NodeJS 中使用 Jimp (Express) 从 Multer 上传多个图像时出现问题

C# 返回数组的数组