我使用的是numpy和Python 2.6.6的1.5.1版本.
我正在将二进制文件读入一个numpy数组:
>>> dt = np.dtype('<u4,<i2,<i2,<i2,<i2,<i2,<i2,<i2,<i2,u1,u1,u1,u1')
>>> file_data = np.fromfile(os.path.join(folder,f), dtype=dt)
Run Code Online (Sandbox Code Playgroud)
这很好用.检查结果:
>>> type(file_data)
<type 'numpy.ndarray'>
>>> file_data
array([(3571121L, -54, 103, 1, 50, 48, 469, 588, -10, 0, 102, 0, 0),
(3571122L, -78, 20, 25, 45, 44, 495, 397, -211, 0, 102, 0, 0),
(3571123L, -69, -48, 23, 60, 19, 317, -26, -151, 0, 102, 0, 0), ...,
(3691138L, -53, 52, -2, -11, 76, 988, 288, -101, 1, 102, 0, 0),
(3691139L, -11, 21, -27, 25, 47, 986, 253, 176, 1, 102, 0, 0),
(3691140L, -30, -19, -63, 59, 12, 729, 23, 302, 1, 102, 0, 0)],
dtype=[('f0', '<u4'), ('f1', '<i2'), ('f2', '<i2'), ... , ('f12', '|u1')])
>>> file_data[0]
(3571121L, -54, 103, 1, 50, 48, 469, 588, -10, 0, 102, 0, 0)
>>> file_data[0][0]
3571121
>>> len(file_data)
120020
Run Code Online (Sandbox Code Playgroud)
当我尝试切片第一列时:
>>> file_data[:,0]
Run Code Online (Sandbox Code Playgroud)
我明白了:
IndexError: invalid index.
Run Code Online (Sandbox Code Playgroud)
我看了一些简单的例子,并且能够进行切片:
>>> a = np.array([(1,2,3),(4,5,6)])
>>> a[:,0]
array([1, 4])
Run Code Online (Sandbox Code Playgroud)
我可以在我的案例和简单示例之间看到的唯一区别是我正在使用dtype.我做错了什么?
Ste*_*rry 15
当您设置类似的dtype时,您正在创建一个记录数组.Numpy将其视为dtype元素的一维数组.两者之间存在根本区别
file_data[0][0]
Run Code Online (Sandbox Code Playgroud)
和
file_data[0,0]
Run Code Online (Sandbox Code Playgroud)
在第一个中,您要求获取1D数组的第一个元素,然后检索返回元素的第一个元素.在第二个中,您要求2D数组的第一列的第一行中的元素.这就是你得到这个原因的原因IndexError
.
如果要使用2D表示法访问单个元素,可以创建视图并使用它.不幸的是,AFAIK如果你想像二维数组那样对待你的对象,所有元素必须具有相同的dtype.
归档时间: |
|
查看次数: |
6641 次 |
最近记录: |