【问题标题】:Efficiently initialize 2D array of size n*m in Python 3?在 Python 3 中有效地初始化大小为 n*m 的二维数组?
【发布时间】:2018-01-06 09:40:52
【问题描述】:

我正在使用 Python 3 并尝试创建已知且固定大小的 2D 整数数组。我该怎么做?

我想到的数组是 Python 提供的 array.array,尽管我并不反对使用像 NumPy 这样的库。

我知道这可以通过列表来完成,但我想使用数组,因为它们更节省空间。现在,我正在以这种方式初始化列表,但我想用数组替换它:

my_list = [[ 0 for _ in range(height) ] for _ in range(.width)]

例如,在 C 中,我会写

int my_array[ width ][ height ];

如何在 Python 中做到这一点

【问题讨论】:

  • 你愿意使用 numpy 吗?
  • 那么,数组究竟是什么意思numpy.ndarray?还是array.array
  • 请发布一个最小的例子。实际的数据类型是什么? docs.python.org/3/library/array.html?
  • 一个array.array。我并不反对使用 NumPy。我会更新我原来的问题;谢谢。

标签: python arrays python-3.x


【解决方案1】:

您发布的代码的 numpy 等效项是:

import numpy as np
my_array = np.empty([height, width])

empty 保留未初始化的空间,所以它比zeros 稍微快一点,因为zeros 必须确保一切初始设置为0。

请注意,就像在 C/C++ 中一样,您应该在读取值之前写入值,因为它们最初“包含垃圾”。

文档:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html

https://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html

【讨论】:

    【解决方案2】:

    你可以使用numpy:

    import numpy as np
    my_array = np.zeros([height, width])
    

    例如:

    >>> np.zeros([3, 5])
    array([[ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.]])
    

    请注意,如果您特别需要整数,则应使用 dtype 参数

    >>> np.zeros([3, 5], dtype=int)
    array([[0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0]])
    

    【讨论】:

    • @tpepin96 是的,他们是。虽然,考虑到您所说的尺寸,即使是列表列表也不会成为现代硬件的问题。
    • @tpepin96 它们是原始数组,所以每个元素都是dtype 所暗示的任何大小......
    • @tpepin96 scipy.sparse 存在于实际上很大(1000x1000 不是)的情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2023-04-11
    • 2018-03-04
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多