Python 将记录添加到numpy记录数组
假设我定义了一个记录数组Python 将记录添加到numpy记录数组,python,numpy,concatenation,record,Python,Numpy,Concatenation,Record,假设我定义了一个记录数组 >>> y=np.zeros(4,dtype=('a4,int32,float64')) 然后我继续填写4个可用的记录。现在我得到了更多的数据,比如 >>> c=('a',7,'24.5') 我想将此记录添加到y。我想不出一个干净的方法来做这件事。我在np.concatenate()中看到的最好的例子,但这需要将c本身转化为一个记录数组。有没有简单的方法把我的元组c固定到y上?这看起来应该非常简单,并且有广泛的文档记录。如果是的话
>>> y=np.zeros(4,dtype=('a4,int32,float64'))
然后我继续填写4个可用的记录。现在我得到了更多的数据,比如
>>> c=('a',7,'24.5')
我想将此记录添加到
y
。我想不出一个干净的方法来做这件事。我在np.concatenate()
中看到的最好的例子,但这需要将c
本身转化为一个记录数组。有没有简单的方法把我的元组c
固定到y
上?这看起来应该非常简单,并且有广泛的文档记录。如果是的话,我道歉。我没有找到它。这是因为通常避免连接numpy数组,因为它需要重新分配连续的内存空间。调整阵列的大小,留出空间,然后在需要时连接成大块。可能会有所帮助。您可以使用numpy.append()
,但在需要将新数据转换为记录数组时:
import numpy as np
y = np.zeros(4,dtype=('a4,int32,float64'))
y = np.append(y, np.array([("0",7,24.5)], dtype=y.dtype))
由于ndarray无法动态更改它的大小,因此当您想要附加一些新数据时,需要复制所有数据。可以创建减少调整大小频率的类:
import numpy as np
class DynamicRecArray(object):
def __init__(self, dtype):
self.dtype = np.dtype(dtype)
self.length = 0
self.size = 10
self._data = np.empty(self.size, dtype=self.dtype)
def __len__(self):
return self.length
def append(self, rec):
if self.length == self.size:
self.size = int(1.5*self.size)
self._data = np.resize(self._data, self.size)
self._data[self.length] = rec
self.length += 1
def extend(self, recs):
for rec in recs:
self.append(rec)
@property
def data(self):
return self._data[:self.length]
y = DynamicRecArray(('a4,int32,float64'))
y.extend([("xyz", 12, 3.2), ("abc", 100, 0.2)])
y.append(("123", 1000, 0))
print y.data
for i in xrange(100):
y.append((str(i), i, i+0.1))
谢谢我现在明白了。我很惊讶,但我理解。