【问题标题】:How can I iterate over an 1D array and build a 2D array in Numpy?如何迭代一维数组并在 Numpy 中构建一个二维数组?
【发布时间】:2012-11-06 10:15:28
【问题描述】:

如果我有一个想要矢量化的一维 numpy.ndarray b 和一个 Python function f,这很容易使用 numpy.vectorize 函数:

c = numpy.vectorize(f)(a).

但是如果 f 返回一维 numpy.ndarray 而不是标量,我该如何构建二维 numpy.ndarray 呢? (也就是说,我希望从f 返回的每个一维numpy.ndarray 成为新二维numpy.ndarray 中的一行。)

例子:

def f(x):
    return x * x

a = numpy.array([1,2,3])
c = numpy.vectorize(f)(a)

def f_1d(x):
    return numpy.array([x, x])

a = numpy.ndarray([1,2,3])
d = ???(f_1d)(a)

在上面的示例中,c 将变为 array([1, 4, 9])。如果d 应该变成array([[1, 1], [2, 2], [3, 3]]),应该用什么替换???

【问题讨论】:

  • 您也可以使用 Kronecker 产品来执行此操作,而无需使用用户定义的函数:d=np.kron(np.ones((1,2),dtype=np.int), a.reshape((-1,1))

标签: python numpy 2d loops multidimensional-array


【解决方案1】:

可以这样做:

def f_1d(x):
    return (x,x)
d = numpy.column_stack(numpy.vectorize(f_1d)(a))

将输出:

array([[1, 1],
       [2, 2],
       [3, 3]])

【讨论】:

  • 我试过了,但是numpy.vectorize(f_1d)(a) 部分会抛出ValueError: setting an array element with a sequence.
  • 用我的替换你对f_1d的定义。
【解决方案2】:

我认为您正在寻找 reshaperepeat

def f(x):
    return x * x
a = numpy.array([1,2,3])
b= numpy.vectorize(f)(a)
c = numpy.repeat(b.reshape( (-1,1) ),2, axis=1)
print c

输出:

[[1 1]
 [4 4]
 [9 9]]

你也可以直接设置 array.shape 元组。 可能值得知道您可以使用map 完成与vectorize 相同的操作,如果您需要编写纯python。 b= numpy.vectorize(f)(a) 将变为 b=map(f,a)

使用这种方法,您根本就不需要f_1d,因为它似乎所做的只是重复信息,而numpy.repeat 做得最好。

此外,这个版本要快一些,但这仅在您处理大型数组时才重要。

【讨论】:

  • 嗯,要么我的问题不够清楚,要么我有什么不明白的地方。我刚刚在我的问题中添加了一个示例,请尽可能更新您的答案。
  • @c00kiemonster 确实,我误解了你的问题,你的例子更清楚了。我已经编辑了我的答案
猜你喜欢
  • 2020-10-06
  • 2011-06-22
  • 2015-07-13
  • 1970-01-01
  • 2011-12-28
  • 2022-11-27
  • 2023-01-04
  • 2013-09-13
  • 2019-07-28
相关资源
最近更新 更多