我想创建一个空数组,并将项附加到它,一次一个。
xs = [] for item in data: xs.append(item)
我可以对NumPy数组使用这种列表风格的符号吗?
可以使用append函数。行:
>>> from numpy import * >>> a = array([10,20,30]) >>> append(a, [[1,2,3]], axis=0) array([[10, 20, 30], [1, 2, 3]])
列:
>>> append(a, [[15],[15]], axis=1) array([[10, 20, 30, 15], [1, 2, 3, 15]])
这是有效使用NumPy的错误思维模式。NumPy数组存储在连续的内存块中。要向现有数组追加行或列,需要将整个数组复制到一个新的内存块,为存储的新元素创建间隙。如果重复这样做,效率是非常低的。
与其追加行,不如分配一个适当大小的数组,然后逐行赋值:
>>> import numpy as np >>> a = np.zeros(shape=(3, 2)) >>> a array([[ 0., 0.], [ 0., 0.], [ 0., 0.]]) >>> a[0] = [1, 2] >>> a[1] = [3, 4] >>> a[2] = [5, 6] >>> a array([[ 1., 2.], [ 3., 4.], [ 5., 6.]])
NumPy数组是一种与列表非常不同的数据结构,被设计成以不同的方式使用。你对hstack的使用可能非常低效…每次调用它时,现有数组中的所有数据都会复制到一个新数组中。(append函数也会有同样的问题。)如果你想一次一列地构建你的矩阵,你最好将它保存在一个列表中,直到它完成,然后才将它转换成一个数组。
hstack
append
如。
mylist = [] for item in data: mylist.append(item) mat = numpy.array(mylist)
item
data
mat = numpy.array(data)
(还要注意,使用list作为变量名可能不是一个好的实践,因为它用该名称掩盖了内置类型,这可能会导致错误。)
list
编辑:
如果出于某种原因,你确实想创建一个空数组,你可以只使用 numpy.array([]),但这很少有用!
numpy.array([])
如果你完全不知道数组的最终大小,你可以像这样增加数组的大小:
my_arr = numpy.zeros((0,5)) for i in range(3): my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) ) print(my_arr) [[ 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1.]]
0
numpy.append
numpy.concatenate
我研究了很多,因为我需要使用numpy。在我的一个学校项目中,我需要将数组初始化为空…我在Stack Overflow上没有找到任何相关的答案,所以我开始涂鸦。
# Initialize your variable as an empty list first In [32]: x=[] # and now cast it as a numpy ndarray In [33]: x=np.array(x)
结果将是:
In [34]: x Out[34]: array([], dtype=float64)
因此,可以直接初始化np数组,如下所示:
In [36]: x= np.array([], dtype=np.float64)
我希望这能有所帮助。
要在NumPy中创建一个空的多维数组(例如,一个2D数组m*n来存储矩阵),如果你不知道m你将追加多少行,并且不关心Stephen Simmons提到的计算成本(即在每次追加时重新构建数组),你可以将你想追加的维度压缩为0:X = np.empty(shape=[0, n])。
m*n
m
X = np.empty(shape=[0, n])
这样你可以使用例如(这里的m = 5,我们假设我们在创建空矩阵时不知道,还有n = 2):
m = 5
n = 2
import numpy as np n = 2 X = np.empty(shape=[0, n]) for i in range(5): for j in range(2): X = np.append(X, [[i, j]], axis=0) print X
这将给你:
[[ 0. 0.] [ 0. 1.] [ 1. 0.] [ 1. 1.] [ 2. 0.] [ 2. 1.] [ 3. 0.] [ 3. 1.] [ 4. 0.] [ 4. 1.]]
你可以应用它来构建任何类型的数组,比如0:
a = range(5) a = [i*0 for i in a] print a [0, 0, 0, 0, 0]
根据你使用它的目的,你可能需要指定数据类型(参见“dtype”)。
例如,要创建一个8位值的2D数组(适合用作单色图像):
myarray = numpy.empty(shape=(H,W),dtype='u1')
对于RGB图像,包含形状中的颜色通道数量:shape=(H,W,3)
shape=(H,W,3)
你也可以考虑使用numpy.zeros而不是使用numpy.empty进行零初始化。参见注释在这里。
numpy.zeros
numpy.empty
我认为你想用列表处理大部分工作,然后将结果作为矩阵使用。也许这是一种方法;
ur_list = [] for col in columns: ur_list.append(list(col)) mat = np.matrix(ur_list)
我认为你可以像这样创建空numpy数组:
>>> import numpy as np >>> empty_array= np.zeros(0) >>> empty_array array([], dtype=float64) >>> empty_array.shape (0,)
当您想在循环中追加numpy数组时,这种格式非常有用。
下面是一些使numpys看起来更像list的方法
np_arr = np.array([]) np_arr = np.append(np_arr , 2) np_arr = np.append(np_arr , 24) print(np_arr)
输出:array([2.], 24。)
为了创建一个空的NumPy数组而不定义它的形状,你可以做以下事情:
arr = np.array([])
首选第一个,因为您知道将使用它作为NumPy数组。NumPy随后将其转换为np.ndarray类型,不需要额外的[]“维度”。
np.ndarray
[]
要向数组中添加新元素,我们可以这样做:
arr = np.append(arr, 'new element')
注意,在python的后台中,没有数组这样的东西 定义它的形状。正如@hpaulj提到的那样,这也会产生一个单秩 数组。< / p >
也许你正在寻找的是这样的东西:
x=np.array(0)
通过这种方式,您可以创建一个没有任何元素的数组。它类似于:
x=[]
通过这种方式,您可以提前向数组中添加新元素。
另一个创建空数组的简单方法是:
import numpy as np np.empty((2,3), dtype=object)
输入:
import numpy as np data = np.zeros((0, 0), dtype=float) # (rows,cols) data.shape
输出: (0,0) < / p >
for i in range(n_files): data = np.append(data, new_data, axis = 0)