从列表创建结构化数组
Creating a structured array from a list
我有一个简单的元素列表,我正在尝试从中创建一个 structured array。
这种天真的方法失败了:
y = np.array([1,2,3], dtype=[('y', float)])
TypeError: expected an object with a buffer interface
将每个元素放入一个元组有效:
# Manuel way
y = np.array([(1,), (2,), (3,)], dtype=[('y', float)])
# Comprehension
y = np.array([tuple((x,)) for x in [1,2,3]], dtype=[('y', float)])
如果我先从列表中创建一个数组,它也可以工作:
y = np.array(np.array([1,2,3]), dtype=[('y', float)])
我有点纳闷。为什么后者有效,但 numpy
提供了一个简单的列表却无法解决问题?
推荐的方法是什么?创建中间值 array
可能不会对性能产生很大影响,但这不是最理想的吗?
我也很惊讶那些不起作用:
# All lists
y = np.array([[1,], [2,], [3,]], dtype=[('y', float)])
TypeError: expected an object with a buffer interface
# All tuples
y = np.array(((1,), (2,), (3,)), dtype=[('y', float)])
ValueError: size of tuple must match number of fields.
我是结构化数组的新手,我不记得 numpy
对输入类型那么挑剔。一定有我遗漏的东西。
np.array
如何处理各种输入的详细信息隐藏在编译代码中。正如有关创建对象 dtype 数组的许多问题所显示的那样,它可能很复杂且令人困惑。基本模型是从嵌套列表创建多维数值数组。
np.array([[1,2,3],[4,5,6]])
在实现结构化数组时,开发人员采用 tuple
作为将记录与另一个嵌套维度区分开来的方法。这在结构化数组的显示中很明显。
定义结构化数组时也是一项要求,尽管 list of tuples
要求有些隐藏在文档中。
In [382]: dt=np.dtype([('y',int)])
In [383]: np.array(alist,dt)
TypeError: a bytes-like object is required, not 'int'
这是我的“1.12.0”版本错误信息。你的好像不一样。
如您所见,列表理解可以将嵌套列表转换为元组列表。
In [384]: np.array([tuple(i) for i in alist],dt)
Out[384]:
array([(1,), (2,), (3,)],
dtype=[('y', '<i4')])
在回答 SO 问题时,这是我最常使用的方法。那个或迭代设置预分配数组的字段(通常记录比字段多得多,因此循环并不昂贵)。
看起来将数组包装在结构化数组调用中等同于 astype
调用:
In [385]: np.array(np.array(alist),dt)
Out[385]:
array([[(1,)],
[(2,)],
[(3,)]],
dtype=[('y', '<i4')])
In [386]: np.array(alist).astype(dt)
Out[386]:
array([[(1,)],
[(2,)],
[(3,)]],
dtype=[('y', '<i4')])
但请注意维数的变化。元组列表创建了一个 (3,) 数组。 astype
将 (3,1)
数值数组转换为 (3,1) 结构化数组。
元组告诉 np.array
的部分内容是 - 区分数组维度和记录 'here'。它解释
[(3,), (1,), (2,)]
[record, record, record]
[[1],[2],[3]]
的自动翻译可能会产生
[[record],[record],[record]]
当数据类型为数字(非结构化)时,它会忽略列表和元组之间的区别
In [388]: np.array([tuple(i) for i in alist],int)
Out[388]:
array([[1],
[2],
[3]])
但是当 dtype 是复合时,开发人员选择使用元组层作为重要信息。
考虑更复杂的结构化数据类型
In [389]: dt1=np.dtype([('y',int,(2,))])
In [390]: np.ones((3,), dt1)
Out[390]:
array([([1, 1],), ([1, 1],), ([1, 1],)],
dtype=[('y', '<i4', (2,))])
In [391]: np.array([([1,2],),([3,4],)])
Out[391]:
array([[[1, 2]],
[[3, 4]]])
In [392]: np.array([([1,2],),([3,4],)], dtype=dt1)
Out[392]:
array([([1, 2],), ([3, 4],)],
dtype=[('y', '<i4', (2,))])
显示(和输入)在列表中的元组中有列表。这只是开始
In [393]: dt1=np.dtype([('x',dt,(2,))])
In [394]: dt1
Out[394]: dtype([('x', [('y', '<i4')], (2,))])
In [395]: np.ones((2,),dt1)
Out[395]:
array([([(1,), (1,)],), ([(1,), (1,)],)],
dtype=[('x', [('y', '<i4')], (2,))])
np.array() 函数接受 列表 作为输入。所以如果你想创建一个2 * 2的矩阵,例如,这就是你需要做的
X = np.array([[1,2], [3,4]])
我有一个简单的元素列表,我正在尝试从中创建一个 structured array。
这种天真的方法失败了:
y = np.array([1,2,3], dtype=[('y', float)])
TypeError: expected an object with a buffer interface
将每个元素放入一个元组有效:
# Manuel way
y = np.array([(1,), (2,), (3,)], dtype=[('y', float)])
# Comprehension
y = np.array([tuple((x,)) for x in [1,2,3]], dtype=[('y', float)])
如果我先从列表中创建一个数组,它也可以工作:
y = np.array(np.array([1,2,3]), dtype=[('y', float)])
我有点纳闷。为什么后者有效,但 numpy
提供了一个简单的列表却无法解决问题?
推荐的方法是什么?创建中间值 array
可能不会对性能产生很大影响,但这不是最理想的吗?
我也很惊讶那些不起作用:
# All lists
y = np.array([[1,], [2,], [3,]], dtype=[('y', float)])
TypeError: expected an object with a buffer interface
# All tuples
y = np.array(((1,), (2,), (3,)), dtype=[('y', float)])
ValueError: size of tuple must match number of fields.
我是结构化数组的新手,我不记得 numpy
对输入类型那么挑剔。一定有我遗漏的东西。
np.array
如何处理各种输入的详细信息隐藏在编译代码中。正如有关创建对象 dtype 数组的许多问题所显示的那样,它可能很复杂且令人困惑。基本模型是从嵌套列表创建多维数值数组。
np.array([[1,2,3],[4,5,6]])
在实现结构化数组时,开发人员采用 tuple
作为将记录与另一个嵌套维度区分开来的方法。这在结构化数组的显示中很明显。
定义结构化数组时也是一项要求,尽管 list of tuples
要求有些隐藏在文档中。
In [382]: dt=np.dtype([('y',int)])
In [383]: np.array(alist,dt)
TypeError: a bytes-like object is required, not 'int'
这是我的“1.12.0”版本错误信息。你的好像不一样。
如您所见,列表理解可以将嵌套列表转换为元组列表。
In [384]: np.array([tuple(i) for i in alist],dt)
Out[384]:
array([(1,), (2,), (3,)],
dtype=[('y', '<i4')])
在回答 SO 问题时,这是我最常使用的方法。那个或迭代设置预分配数组的字段(通常记录比字段多得多,因此循环并不昂贵)。
看起来将数组包装在结构化数组调用中等同于 astype
调用:
In [385]: np.array(np.array(alist),dt)
Out[385]:
array([[(1,)],
[(2,)],
[(3,)]],
dtype=[('y', '<i4')])
In [386]: np.array(alist).astype(dt)
Out[386]:
array([[(1,)],
[(2,)],
[(3,)]],
dtype=[('y', '<i4')])
但请注意维数的变化。元组列表创建了一个 (3,) 数组。 astype
将 (3,1)
数值数组转换为 (3,1) 结构化数组。
元组告诉 np.array
的部分内容是 - 区分数组维度和记录 'here'。它解释
[(3,), (1,), (2,)]
[record, record, record]
[[1],[2],[3]]
的自动翻译可能会产生
[[record],[record],[record]]
当数据类型为数字(非结构化)时,它会忽略列表和元组之间的区别
In [388]: np.array([tuple(i) for i in alist],int)
Out[388]:
array([[1],
[2],
[3]])
但是当 dtype 是复合时,开发人员选择使用元组层作为重要信息。
考虑更复杂的结构化数据类型
In [389]: dt1=np.dtype([('y',int,(2,))])
In [390]: np.ones((3,), dt1)
Out[390]:
array([([1, 1],), ([1, 1],), ([1, 1],)],
dtype=[('y', '<i4', (2,))])
In [391]: np.array([([1,2],),([3,4],)])
Out[391]:
array([[[1, 2]],
[[3, 4]]])
In [392]: np.array([([1,2],),([3,4],)], dtype=dt1)
Out[392]:
array([([1, 2],), ([3, 4],)],
dtype=[('y', '<i4', (2,))])
显示(和输入)在列表中的元组中有列表。这只是开始
In [393]: dt1=np.dtype([('x',dt,(2,))])
In [394]: dt1
Out[394]: dtype([('x', [('y', '<i4')], (2,))])
In [395]: np.ones((2,),dt1)
Out[395]:
array([([(1,), (1,)],), ([(1,), (1,)],)],
dtype=[('x', [('y', '<i4')], (2,))])
np.array() 函数接受 列表 作为输入。所以如果你想创建一个2 * 2的矩阵,例如,这就是你需要做的
X = np.array([[1,2], [3,4]])