python - 使用索引数组从任意维的 ndarray 中提取 2d ndarray

标签 python numpy numpy-ndarray

我想根据某些维度的索引位置数组提取 numpy ndarray 的一部分。让我用一个例子来说明这一点

示例数据

dummy = np.random.rand(5,2,100)
X = np.array([[0,1],[4,1],[2,0]])

dummy 是维度为 5x2x100 的原始 ndarray。这个维度是任意的,也可以是 5x2x4x100。
X是索引值矩阵,这里X[:,0]dummy第一维的索引,X [:,1] 那些二维的。 X 中的列数始终是 dummy 中的维数减 1。

示例输出

我想为此示例提取以下形式的 ndarray

[
  dummy[0,1,:],
  dummy[4,1,:],
  dummy[2,0,:]
]

并发症

如果 dummy 中的维数是固定的,这可以通过 dummy[X[:,0],X[:,1],:] 。遗憾的是维度可能不同,例如dummy 可以是 5x2x4x6x100 ndarray 并且 X 相应地是 3x4 。我尝试处理它并没有产生预期的结果。

  • dummy[X,:] 在此示例中生成一个 3x2x2x100 ndarray,与 dummy[X]
  • 相同
  • 迭代地减少 dummy 通过做类似 dummy = dummy[X[:,i],:]i 的迭代器X 的列数也不会减少示例中的 ndarray 过去 3x2x100

我觉得使用 numpy 索引应该很简单,但我想我对解决方案的搜索缺少正确的术语。
有人对此有解决方案吗?

最佳答案

我将尝试为@Michael Szczesny 的回答提供一些可解释性。

首先,请注意,如果您有一个 np.array尺寸 n并通过 m索引 m<n , 那么它将与使用相同 :在维度 >=m .例如,在您的情况下:

dummy[(0, 0)] == dummy[0, 0, :]

鉴于此,请注意您还可以将数组作为索引传递。因此:

dummy[([0, 1], [0, 0])]

这将是一样的:

np.array([dummy[(0,0)], dummy[(1,0)]])

您可以使用以下方式验证:

dummy[([0, 1], [0, 0])] == np.array([dummy[(0,0)], dummy[(1,0)]])

最后,请注意:

(*X.T,)
# (array([0, 4, 2]), array([1, 1, 0]))

你在这里获取每个维度作为一个数组,然后你将得到:

[
  dummy[0,1],
  dummy[4,1],
  dummy[2,0]
]

这与:

[
  dummy[0,1,:],
  dummy[4,1,:],
  dummy[2,0,:]
]

编辑:您可以使用 tuple(X.T) 而不是使用 (*X.T,),这对我来说更有意义

关于python - 使用索引数组从任意维的 ndarray 中提取 2d ndarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73771467/

相关文章:

python - 如何在 python 中获取 Windows 短文件名?

python - NumPy 有像 Pandas 一样的 select_dtypes 吗?

python - 如何在 pandas Dataframe 中查找 numpy 数组列的 boolean 值?

python - 具有多个 X 特征和 Python 中的单个 Y 的散点图

python - 如何快速比较 ndarray 的每个元素与排序列表/数组的每个元素?

python - 在 Python 中用累积数字进行元素划分?

python - python : InvalidMatch 中的正则表达式模式

python - 如何获取 os.system() 输出作为字符串而不是一组字符?

python - 什么时候应该使用 pathlib.Path.mkdir() 与 os.mkdir() 或 os.makedirs()?

python - Matlab 和 Python 读取二进制文件的不同方式