Eri*_*got 10 python collections numpy namedtuple
是否可以创建一个行为非常类似于collections.namedtuple的NumPy对象,因为可以像这样访问元素:
data[1] = 42
data['start date'] = '2011-09-20' # Slight generalization of what is possible with a namedtuple
Run Code Online (Sandbox Code Playgroud)
我试图使用复杂的数据类型:
>>> data = numpy.empty(shape=tuple(), dtype=[('start date', 'S11'), ('n', int)])
Run Code Online (Sandbox Code Playgroud)
这会创建一个带有一种namedtuple类型的0维值; 它几乎可以工作:
>>> data['start date'] = '2011-09-20'
>>> data
array(('2011-09-20', -3241474627884561860),
dtype=[('start date', '|S11'), ('n', '<i8')])
Run Code Online (Sandbox Code Playgroud)
但是,元素访问不起作用,因为"数组"是0维的:
>>> data[0] = '2011-09-20'
Traceback (most recent call last):
File "<ipython-input-19-ed41131430b9>", line 1, in <module>
data[0] = '2011-09-20'
IndexError: 0-d arrays can't be indexed.
Run Code Online (Sandbox Code Playgroud)
有没有办法通过NumPy对象获得上述所需的行为(通过字符串和索引分配项目)?
(根据 EOL 建议进行编辑,以便更具体地回答问题。)
创建 0-dim 数组(我也没有找到标量构造函数。)
>>> data0 = np.array(('2011-09-20', 0), dtype=[('start date', 'S11'), ('n', int)])
>>> data0.ndim
0
Run Code Online (Sandbox Code Playgroud)
访问 0-dim 数组中的元素
>>> type(data0[()])
<class 'numpy.void'>
>>> data0[()][0]
b'2011-09-20'
>>> data0[()]['start date']
b'2011-09-20'
>>> #There is also an item() method, which however returns the element as python type
>>> type(data0.item())
<class 'tuple'>
Run Code Online (Sandbox Code Playgroud)
我认为最简单的方法是将结构化数组(或重新数组)视为元组列表或数组,并且索引按选择列的名称和选择行的整数进行索引。
>>> tupleli = [('2011-09-2%s' % i, i) for i in range(5)]
>>> tupleli
[('2011-09-20', 0), ('2011-09-21', 1), ('2011-09-22', 2), ('2011-09-23', 3), ('2011-09-24', 4)]
>>> dt = dtype=[('start date', '|S11'), ('n', np.int64)]
>>> dt
[('start date', '|S11'), ('n', <class 'numpy.int64'>)]
Run Code Online (Sandbox Code Playgroud)
零维数组,元素是元组,即一条记录,更改:不是标量元素,见末尾
>>> data1 = np.array(tupleli[0], dtype=dt)
>>> data1.shape
()
>>> data1['start date']
array(b'2011-09-20',
dtype='|S11')
>>> data1['n']
array(0, dtype=int64)
Run Code Online (Sandbox Code Playgroud)
具有一个元素的数组
>>> data2 = np.array([tupleli[0]], dtype=dt)
>>> data2.shape
(1,)
>>> data2[0]
(b'2011-09-20', 0)
Run Code Online (Sandbox Code Playgroud)
一维数组
>>> data3 = np.array(tupleli, dtype=dt)
>>> data3.shape
(5,)
>>> data3[2]
(b'2011-09-22', 2)
>>> data3['start date']
array([b'2011-09-20', b'2011-09-21', b'2011-09-22', b'2011-09-23',
b'2011-09-24'],
dtype='|S11')
>>> data3['n']
array([0, 1, 2, 3, 4], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
直接索引到单个记录中,与 EOL 的示例相同,但我不知道它是否有效
>>> data3[2][1]
2
>>> data3[2][0]
b'2011-09-22'
>>> data3[2]['n']
2
>>> data3[2]['start date']
b'2011-09-22'
Run Code Online (Sandbox Code Playgroud)
试图理解 EOL 的示例:标量元素和零维数组是不同的
>>> type(data1)
<class 'numpy.ndarray'>
>>> type(data1[()]) #get element out of 0-dim array
<class 'numpy.void'>
>>> data1[0]
Traceback (most recent call last):
File "<pyshell#98>", line 1, in <module>
data1[0]
IndexError: 0-d arrays can't be indexed
>>> data1[()][0]
b'2011-09-20'
>>> data1.ndim
0
>>> data1[()].ndim
0
Run Code Online (Sandbox Code Playgroud)
(注:我无意中在打开的 python 3.2 解释器中输入了该示例,因此有一个 b'...')
| 归档时间: |
|
| 查看次数: |
3120 次 |
| 最近记录: |