动态增加numpy数组

时间:2016-01-06 19:05:47

标签: python arrays numpy

在“Complex matlab-like data structure in python (numpy/scipy)”的帮助下,我提出了:

s=(5,3)
a=np.zeros(s, dtype=[('Int1', int),
                     ('Int2', int),
                     ('Str1', '|S5')])

a[0,0]=(1,2,'abcde')
a[0,1]=((5,2,'fghij'),(7,9,'klmno'))

问题是,在我的数组a的某些字段中,就像在字段a[0,1]中一样,我想添加一个或多个额外的“信息”,就像在我的代码示例中。我不知道有多少额外信息要写入矩阵的哪一部分,但我总是要用dtype=[(int, int, string)]来编写元组。

当然,当我尝试按照a[0,1]的方式写入时,我收到错误。

我想保留我的矩阵a 2维,但我想将dtype=[int, int, str]的几个实例写入一个字段,类似于我在字段a[0,1]中尝试的内容

希望我能以一种易于理解的方式解释我的问题。

2 个答案:

答案 0 :(得分:1)

numpy数组可能是这种灵活性的错误数据结构。创建后,您的数组a会占用一定量的内存。它有15(5 * 3)条记录,每条记录包含2个整数和一个包含5个字符的字符串。您可以修改值,但不能添加新记录,也不能将一条记录更改为两条记录的组合。

列表使您可以灵活地添加元素并更改其性质。列表包含指向位于内存中的对象的指针。

dtype = object数组的行为与列表非常相似。它的数据缓冲区是同一种指针。 a=np.zeros((3,5), dtype=object)是一个二维数组,其中每个元素可以是元组,列表,数字,无,元组元组等。但是使用这种数组,你会失去很多二维数值计算能力。

使用结构化数组,增加其大小或添加字段的唯一方法是创建一个新数组并复制数据。有些函数可以帮助添加字段,但它们以某种方式完成了我刚才描述的内容。

根据您的定义,有3个字段['Int1','Int2','Str1']

a=np.zeros(s, dtype=[('Int1', int),
                     ('Int2', int),
                     ('Str1', '|S5')])

增加字段数(通过字段的概念)将类似于

a1=np.zeros(s, dtype=[('Int1', int),
                     ('Int2', int),
                     ('Str1', '|S5'),
                     ('Str2', '|S5')])

即添加名为' Str2'的字段。你可以填写

表示a.dtype.fields中的名称:        a1 [name] = a [name]

现在a2中的所有记录都与a中的数据相同,但它们也有一个空白的Str2字段。您可以单独为每个元素设置该字段,也可以将其设置为:

a['Str2'] = ...

但是你将A[0,1]改为元组元组的尝试是完全不同的。这就像尝试用两个数字替换常规数字数组的元素一样:

x = np.arange(10)
x[3] = [3,5]

适用于列表x=range(10),但不适用于数组。

答案 1 :(得分:0)

我的代码现在看起来像这样:

s=(5,3)   
a=np.zeros(s, dtype=object)  
a[0,0]=(1,2,'abcde')  
a[0,1]=((5,2,'fghij'),(7,9,'klmno'))

我可以看到/访问条目:

print(a[0,1])
print(a[0,1][0])
print(a[0,1][1])