【问题标题】:How to subset a numpy array of different lengths如何对不同长度的numpy数组进行子集化
【发布时间】:2019-07-21 06:17:18
【问题描述】:

我有一个 numpy 数组,想对 ndarray 中每个元素的前两个数组进行子集化。

这是一个示例数组:

import numpy as np

a1 = np.array([[ 1,  2,  3],
               [ 4,  5,  6]])

a2 = np.array([[ 7,  8,  9],
               [10, 11, 12],
               [13, 14, 15],
               [16, 17, 18]])

a3 = np.array([[19, 20, 21],
               [22, 23, 24],
               [25, 26, 27]])

A = np.array([a1, a2, a3])

print("A =\n", A)

哪些打印:

A =
   [array([[ 1,  2,  3],
           [ 4,  5,  6]])
    array([[ 7,  8,  9],
           [10, 11, 12],
           [13, 14, 15],
           [16, 17, 18]])
    array([[19, 20, 21],
           [22, 23, 24],
           [25, 26, 27]])]

想要的结果如下:

A =
   [array([[ 1,  2,  3],
           [ 4,  5,  6]])
    array([[ 7,  8,  9],
           [10, 11, 12]])
    array([[19, 20, 21],
           [22, 23, 24]])]

要打印等效对象,您可以这样做

print(np.array([a1[0:2], a2[0:2], a3[0:2]]))

但我想直接用 A 得到想要的东西。

在 numpy 中这样做的正确方法是什么?

编辑:我想在不循环的情况下对数组进行子集化。构造数组以便可以直接索引它们的替代方法也可以。任何避免循环的 numpy 函数都是公平的游戏。

【问题讨论】:

  • 这对我来说没有意义。您基本上有 3 个不同大小的 ndarray。然后将它们放入一个大小为 3 的单个 ndarray。您如何期望在不单独索引它们的情况下对它们进行切片?
  • 是否有另一种方法来构造数组?理想情况下,它们可以在没有循环的情况下实现子集化。
  • A(对象dtype数组)进行操作与对列表[a1,a2,a3]进行操作基本相同。两者都包含指向 3 个数组的指针。事实上,在列表上循环更快。没有索引A 的子数组的“无循环”方法。现在,如果子数组都具有相同的形状,A 将是 (3,3,3) 形状,您可以在中间维度上对A[:, 0:2, :] 进行切片。
  • hpaulj 的回答最接近我的要求。但是将它们全部填充似乎是一项昂贵的成本——使第二维成为 a1、a2 或 a3 的最大长度,只是为了能够索引到最小的长度。

标签: python numpy


【解决方案1】:

a = [i[0:2] for i in A]

这行得通!

【讨论】:

  • 列表理解本质上是一个for循环,OP说他不想要循环......
  • 他在我回答后编辑它说没有 for 循环。我知道列表理解是一个循环。但即使有一个 numpy 方法,它仍然会循环。
  • 让我们对此有所挑剔。这不是循环或没有循环的问题。这是一个问题,我们是在解释的 Python 级别还是在编译的 numpy 代码中进行循环。使用 object dtype,对对象的大多数操作都以 Python 速度运行。
猜你喜欢
  • 2019-01-23
  • 2015-09-04
  • 2023-02-08
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2018-01-27
  • 2021-12-16
  • 2020-04-05
相关资源
最近更新 更多