【问题标题】:Defining empty numpy array when we do not know the size当我们不知道大小时定义空的numpy数组
【发布时间】:2021-12-06 01:18:45
【问题描述】:

据我了解,当我们要定义一个numpy数组时,我们必须定义它的大小。

但是,就我而言,我想定义一个 numpy 数组,然后根据我在 for 循环中的值对其进行扩展。每次运行的值的形状可能不同。所以我无法提前定义numpy数组的形状。

有什么办法可以克服吗?

我想避免使用列表。

谢谢

【问题讨论】:

  • 请您举一些例子吗?
  • 无法创建没有大小的 NumPy 数组。您可以从一个小的(1 个元素?)数组开始,然后向其中添加项目。
  • 抱歉,这不是我们在 numpy 中做事的方式。列表是为了增长。数组有固定的大小。
  • 如果你知道for循环的范围,你就知道目标数组的大小。
  • 为什么要避免使用列表?使用 append 增长一个列表比通过创建一个新的数组并从旧的复制数据来增长一个数组要快得多。您显然使用过 MATLAB。在那里,您可以通过索引M[i,j]=0 来增长矩阵,但我怀疑这在后台做了很多工作。这不是我多年前使用 MATLAB 时经常做的事情。

标签: python arrays python-3.x list numpy


【解决方案1】:
import numpy as np  
myArrayShape = 2
myArray = np.empty(shape=2)

请注意,这会为数组中的每个元素生成随机值。

【讨论】:

  • 但是这里的empty和emlty列表的意思不一样,[]
【解决方案2】:

我认为 numpy 数组就像 clang 或 c++ 中的数组,我的意思是当你制作 numpy 数组时,你分配的内存取决于你的请求(大小和 dtype)。 所以最好在数组的大小确定之后再做数组。

或者你可以试试 numpy.append https://numpy.org/doc/stable/reference/generated/numpy.append.html 但我认为这不是更可取的方式,因为它会不断生成新数组。

【讨论】:

  • 我非常讨厌np.append。它不是列表追加克隆。
【解决方案3】:

来自 Octave (free-MATLAB) 文档,https://octave.org/doc/v6.3.0/Advanced-Indexing.html

In cases where a loop cannot be avoided, or a number of values must be combined to form a larger matrix, it is generally faster to set the size of the matrix first (pre-allocate storage), and then insert elements using indexing commands. For example, given a matrix a,

[nr, nc] = size (a);
x = zeros (nr, n * nc);
for i = 1:n
  x(:,(i-1)*nc+1:i*nc) = a;
endfor
is considerably faster than

x = a;
for i = 1:n-1
  x = [x, a];
endfor
because Octave does not have to repeatedly resize the intermediate result.

同样的想法也适用于numpy。虽然您可以从 (0,n) 形状的数组开始,然后增长 concatenating (1,n) 数组,但这比从 (m,n) 数组开始并分配值要慢得多。

有一个已删除的答案说明了如何通过列表追加创建数组。强烈推荐。

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2016-03-06
    • 2020-11-30
    • 2015-07-05
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多