初始化一个数字数组

有没有方法初始化一个形状的数字数组并添加到它?我将用一个列表示例来解释我需要什么。如果我想创建一个循环中生成的对象列表,我可以这样做:

a = []
for i in range(5):
a.append(i)

我想用一个 numpy 数组做一些类似的事情。我知道 vstack,concatenate 等等。然而,这些似乎需要两个数字数组作为输入。我需要的是:

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
array i of shape = (2,4) created.
add to big_array

big_array应该有一个形状 (10,4)。如何做到这一点?


编辑:

我想补充以下说明。我知道我可以定义 big_array = numpy.zeros((10,4)),然后填充它。但是,这需要事先指定 big _ array 的大小。我知道这个案子的规模,但如果我不知道呢?当我们使用 .append函数在 python 中扩展列表时,我们不需要事先知道它的最终大小。我想知道是否存在类似的方法来从较小的数组创建更大的数组,从一个空数组开始。

718419 次浏览

numpy.zeros

返回给定形状的新数组 类型,用零填充。

或者

numpy.ones

返回给定形状的新数组 类型,充满了一个。

或者

numpy.empty

返回给定形状的新数组 类型,而不初始化条目。


然而,在 numpy 中,我们通过向列表添加元素来构造数组的思想并没有得到很好的应用,因为它的效率较低(numpy 数据类型更接近底层的 C 数组)。相反,您应该将数组预先分配到所需的大小,然后填充行。但是,如果必须的话,可以使用 numpy.append

在进行数组计算时,您确实希望尽可能避免显式的循环,因为这会降低从这种形式的计算中获得的速度增益。初始化一个数字数组有多种方法。如果你想让它充满零,就像 katrielalex 说的那样:

big_array = numpy.zeros((10,4))

编辑: 你在做什么样的序列?您应该查看创建数组的不同的 numpy 函数,如 numpy.linspace(start, stop, size)(等间距数字)或 numpy.arange(start, stop, inc)。在可能的情况下,这些函数将使数组比在显式循环中做同样的工作快得多

对于第一个数组示例,

a = numpy.arange(5)

若要初始化 big _ array,请使用

big_array = numpy.zeros((10,4))

这里假设您希望使用零进行初始化,这非常典型,但是还有许多其他的 在 numpy 中初始化数组的方法

编辑: 如果您事先不知道 big _ array 的大小,那么通常最好首先使用 append 构建一个 Python 列表,当您在列表中收集了所有内容后,使用 numpy.array(mylist)将该列表转换为一个 numpy 数组。这样做的原因是,列表的增长是非常有效和快速的,而 numpy.concatenate 的效率会非常低,因为 numpy 数组不容易改变大小。但是一旦所有内容都收集到一个列表中,并且您知道最终的数组大小,就可以有效地构造一个数字数组。

我通常的做法是创建一个常规列表,然后将我的内容添加到其中,最后将列表转换为一个数字数组,如下所示:

import numpy as np
big_array = [] #  empty regular list
for i in range(5):
arr = i*np.ones((2,4)) # for instance
big_array.append(arr)
big_np_array = np.array(big_array)  # transformed to a numpy array

当然,在创建步骤中,最终对象占用的内存空间是原来的两倍,但是在 python 列表中添加对象非常快,而且使用 np.array ()创建对象也非常快。

numpy.fromiter()就是你要找的:

big_array = numpy.fromiter(xrange(5), dtype="int")

它还可以处理生成器表达式,例如:

big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )

如果预先知道数组的长度,可以使用可选的“ count”参数指定它。

蟒蛇的数组模拟

a = []
for i in range(5):
a.append(i)

是:

import numpy as np


a = np.empty((0))
for i in range(5):
a = np.append(a, i)

我意识到这有点晚了,但我没有注意到任何其他的答案提到索引到空数组:

big_array = numpy.empty(10, 4)
for i in range(5):
array_i = numpy.random.random(2, 4)
big_array[2 * i:2 * (i + 1), :] = array_i

这样,您可以使用 numpy.empty预分配整个结果数组,并在使用索引赋值时填充行。

在您给出的示例中,使用 empty而不是 zeros预分配是完全安全的,因为您要保证整个数组将用您生成的块填充。

1.8版本:

numpy.full

返回一个给定形状和类型的新数组,该数组由 fill _ value 填充。

例子:

>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf,  inf],
[ inf,  inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
[10, 10]])

我建议先定义形状。 然后对它进行迭代以插入值。

big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
big_array[it] = (it,it) # For example


>>>big_array


array([[ 0.,  0.],
[ 1.,  1.],
[ 2.,  2.],
[ 3.,  3.],
[ 4.,  4.],
[ 5.,  5.]])

无论何时,只要你处于下列情况:

a = []
for i in range(5):
a.append(i)

你想要一些类似的数字,之前的几个答案已经指出了这样做的方法,但是正如@katrielalex 指出的那样,这些方法是没有效率的。做到这一点的有效方法是建立一个长列表,然后重新塑造它的方式后,你有一个长列表。例如,假设我正在从一个文件中读取一些行,每一行都有一个数字列表,我想构建一个形状的数组(读取的行数、每一行的向量长度)。以下是我将如何更有效地做到这一点:

long_list = []
counter = 0
with open('filename', 'r') as f:
for row in f:
row_list = row.split()
long_list.extend(row_list)
counter++
#  now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array

也许这样的东西会适合你的需要. 。

import numpy as np


N = 5
res = []


for i in range(N):
res.append(np.cumsum(np.ones(shape=(2,4))))


res = np.array(res).reshape((10, 4))
print(res)

它产生以下输出

[[ 1.  2.  3.  4.]
[ 5.  6.  7.  8.]
[ 1.  2.  3.  4.]
[ 5.  6.  7.  8.]
[ 1.  2.  3.  4.]
[ 5.  6.  7.  8.]
[ 1.  2.  3.  4.]
[ 5.  6.  7.  8.]
[ 1.  2.  3.  4.]
[ 5.  6.  7.  8.]]

用特定的矩阵初始化一个数字数组:

import numpy as np


mat = np.array([[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[1, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1]])


print mat.shape
print mat

产出:

(5, 5)
[[1 1 0 0 0]
[0 1 0 0 1]
[1 0 0 1 1]
[0 0 0 0 0]
[1 0 1 0 1]]

如果要在多维数组中添加项,以下是解决方案。

import numpy as np
big_array = np.ndarray(shape=(0, 2, 4) # Empty with height and width 2, 4 and length 0


for i in range(5):
big_array = np.concatenate((big_array, i))

这里是麻木的 转介的正式文件

# https://thispointer.com/create-an-empty-2d-numpy-array-matrix-and-append-rows-or-columns-in-python/


# Create an empty Numpy array with 4 columns or 0 rows
empty_array = np.empty((0, 4), int)


# Append a row to the 2D numpy array
empty_array = np.append(empty_array, np.array([[11, 21, 31, 41]]), axis=0)
# Append 2nd rows to the 2D Numpy array
empty_array = np.append(empty_array, np.array([[15, 25, 35, 45]]), axis=0)
print('2D Numpy array:')
print(empty_array)

注意每个输入的 np.array 都是2维的