在“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]
中尝试的内容
希望我能以一种易于理解的方式解释我的问题。
答案 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])