【问题标题】:How to convert 1D numpy arrays element-wire into new 1D numpy array?如何将一维 numpy 数组元素线转换为新的一维 numpy 数组?
【发布时间】:2019-08-14 12:01:36
【问题描述】:

我有 n numpy 一维数组 ì_0 = [i00, i01, i02, ...], i_1 = [i10, i11, i12, ...], ... 并且想将这些值放入 m 新的一维数组 o_0 = [i00, i10, 120, ...], o_1 = [i01, i11, i21, ...], ... 其中@ 987654327@ 是等长数组i_0, i_1, ... 的元素计数。如何尽可能高效地实现这一点(在迭代 o_0o_1、... 数组时可能会启用 Python 惰性)?

考虑这个示例输入数据i_0(向上转换),i_1

import numpy as np

i_0 = np.array([1.0, 2, 3])
i_1 = np.array([1.1, 2.1, 3.1])

应转化为m=3 输出o_0o_1o_2

o_0 = np.array([1.0, 1.1])
o_1 = np.array([2.0, 2.1])
o_2 = np.array([3.0, 3.1])

或成二维数组o

o = np.array([[1.0, 1.1], [2.0, 2.1], [3.0, 3.1]])

相当于

o = np.array([o_0, o_1, o_2])

标签: python numpy


【解决方案1】:

首先是一个问题:为什么是元素方面的?您想在从输入到输出数组的过程中对每个点进行处理吗?如果是这样,您要么需要简单地循环输入数组,要么使用 python 的yield(可能节省工作内存)。或者,如果可能的话,您可以将您的步骤包含在一个函数中以对操作进行矢量化,从而一次性(按元素)在一个完整的 numpy 数组上执行。

编辑:

在这种情况下(您的具体示例)实际上非常简单,因为您可以将输入数组加入到单个矩阵中,如下所示:

input = np.vstack([i_0, i_1])

现在简单地转置矩阵,以获得您的结果:

result = input.T

要再次从向量中提取数组,您可以像这样解包它们:

o_1, o_2 = result    # 2 output arrays for input arrays, each of 2 elements

您可以使用 python list comprehension 或类似方法来为实际上具有更多输入/输出向量的矩阵执行此操作。


这个答案是针对你的情况的,但希望能展示 numpy 数组如何用于在单个调用(或几个)中执行操作,与你迭代每个元素的 C/C++ 等语言相比。在幕后,这就是 numpy 为您所做的(实际上是在 C 中),因此您在 python 中获得了类似 C 的性能。如果您熟悉低级语言,则在考虑使用 numpy 时,您可能需要改变自己的方式。

【讨论】:

  • 你是对的,转换不会发生在元素上,而是发生在所有元素上。我相应地改进了这个问题。
  • 如果我运行o_1, o_2 = result,我会得到ValueError: too many values to unpack (expected 2)
  • 当使用 pandas DataFrame 而不是 numpy 数组时,等效代码会是什么样子?我猜 DataFrame 的性能不如数组...
  • @thinwybk - Pandas 数据帧在底层拥有一个基本的 numpy 数组,因此您可以使用与上述相同的代码,指定数据帧的数组 df,如下所示:df.values。跨度>
猜你喜欢
  • 2023-02-03
  • 1970-01-01
  • 2012-09-16
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 2020-04-14
  • 2021-04-04
相关资源
最近更新 更多