据我所知,listPython中的类型是一个动态指针数组,当项目被附加到它时会增加它的容量.NumPy中的数组使用连续的内存区域来保存数组的所有数据.
是否有任何类型可以动态增加其作为列表的容量,并将值存储为NumPy数组?类似于C#中的List.如果类型具有与NumPy数组相同的接口,那就太棒了.
我可以创建一个包含NumPy数组的类,并在它完整时调整此数组的大小,例如:
class DynamicArray(object):
def __init__(self):
self._data = np.zeros(100)
self._size = 0
def get_data(self):
return self._data[:self._size]
def append(self, value):
if len(self._data) == self._size:
self._data = np.resize(self._data, int(len(self._data)*1.25))
self._data[self._size] = value
self._size += 1
Run Code Online (Sandbox Code Playgroud)
但DynamicArray不能用作NumPy数组,我认为在np.resize()之前get_data()返回的所有视图都将保留旧数组.
编辑:数组模块中的数组类型是动态数组.以下程序测试列表和数组的增加因子:
from array import array
import time
import numpy as np
import pylab as pl
def test_time(func):
arrs = [func() for i in xrange(2000)]
t = []
for i in xrange(2000):
start = time.clock()
for a in arrs:
a.append(i)
t.append(time.clock()-start)
return np.array(t)
t_list …Run Code Online (Sandbox Code Playgroud) 我有一个numpy数组,我可以使用append简单地追加一个项目,如下所示:
numpy.append(myarray, 1)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我只是附加了整数1.
但这是附加到阵列的最快方法吗?我有一个非常长的阵列,成千上万.
或者更好的索引数组并直接分配它?像这样:
myarray[123] = 1
Run Code Online (Sandbox Code Playgroud) 我会保持简单.我有一个循环,将新行附加到numpy数组...这是有效的方法.
n=np.zeros([1,2])
for x in [[2,3],[4,5],[7,6]]
n=np.append(n,x,axis=1)
Run Code Online (Sandbox Code Playgroud)
现在问题是[0,0]坚持它所以我必须删除它
del n[0]
Run Code Online (Sandbox Code Playgroud)
这似乎是愚蠢的...所以请告诉我一个有效的方法来做到这一点.
n=np.empty([1,2])
Run Code Online (Sandbox Code Playgroud)
更糟糕的是它创造了一个未初始化的价值.
我有很多文件,每个文件都被读取为 shape 的矩阵(n, 1000),其中 n 可能因文件而异。
我想将它们全部连接成一个大的 Numpy 数组。我目前这样做:
dataset = np.zeros((100, 1000))
for f in glob.glob('*.png'):
x = read_as_numpyarray(f) # custom function; x is a matrix of shape (n, 1000)
dataset = np.vstack((dataset, x))
Run Code Online (Sandbox Code Playgroud)
但它效率低下,因为我dataset通过将现有数组与读取的下一个文件堆叠起来多次重新定义。
如何使用 Numpy 以更好的方式做到这一点,避免整个数据集在内存中多次重写?
注意:最终的大 Numpy 数组可能需要 10 GB。