4

我做了一个dtype是:

mytype = np.dtype([('a',np.uint8), ('b',np.uint8), ('c',np.uint8)])

所以使用这个dtype的数组:

test1 = np.zeros(3, dtype=mytype)

测试1是:

array([(0, 0, 0), (0, 0, 0), (0, 0, 0)],
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

现在我有test2:

test2 = np.array([[1,2,3], [4,5,6], [7,8,9]])

当我使用test2.astype(mytype)时,结果不是我想要的:

array([[(1, 1, 1), (2, 2, 2), (3, 3, 3)],
       [(4, 4, 4), (5, 5, 5), (6, 6, 6)],
       [(7, 7, 7), (8, 8, 8), (9, 9, 9)]],
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

我希望结果是:

array([(1, 2, 3), (4, 5, 6), (7, 8, 9)],
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

有什么办法吗?谢谢。

4

3 回答 3

5

您可以使用fromarraysnumpy.core.records 的方法(请参阅文档):

np.rec.fromarrays(test2.T, mytype)
Out[13]: 
rec.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)], 
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

必须首先对数组进行转置,因为函数将数组的行视为输出中结构化数组的列。另请参阅此问题:将 2D numpy 数组转换为结构化数组

于 2011-10-04T07:48:08.207 回答
0

因为所有的字段都是相同的类型,你也可以使用:

>>> test2.astype(np.uint8).view(mytype).squeeze(axis=-1)
array([(1, 2, 3), (4, 5, 6), (7, 8, 9)], 
      dtype=[('a', 'u1'), ('b', 'u1'), ('c', 'u1')])

需要挤压,因为test2是 2d,但您想要 1d 结果

于 2017-07-14T15:57:15.880 回答
0

创建数组时,如果输入可迭代包含元组(保证不可变)而不是列表(保证不可变),那么只要其中的项目数,它将自动以您想要的方式获取输入每个元组等于结构中的字段数:

In[7]: test2 = np.array([(1,2,3), (4,5,6), (7,8,9)], dtype = mytype)

In[8]: test2
Out[8]: 
array([(1, 2, 3), (4, 5, 6), (7, 8, 9)],
      dtype=[('a', 'u1'), ('b', 'u1'), ('c', 'u1')])

没有必要为此去np.rec等。但是,如果输入迭代包含列表而不是元组,那么numpy不会像您期望的那样一对一地获取字段并进行数据复制。

于 2019-08-10T10:40:01.390 回答