Python和科学计算认证群组  - 讨论区

标题:关于numpy 中dtype的问题

2011年11月21日 星期一 15:39

手中有几组数据:

例如

import numpy as np

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

b=np.array([a,b,c,d,e,f,g,h,i])

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

datatype=np.dtype({

'names':['num','char','len'],

'formats':['i','s32','i']

})

先将a,b,c的shape更改为(-1,1)及列向量

然后我想通过

d=np.array([a,b,c],dtype=datatype)

生产如下数据

d=[[1,a,9],[2,b,8]...]

结果却是

[[[(1, '',0)]

  [(2, '',0)]

  [(3, '',0)]

  [(4, '',0)]

  [(5, '',0)]

  [(6, '',0)]

  [(7, '',0)]

  [(8, '',0)]

  [(9, '',0)]]...]

是将a,b,c分别应用了datatype。

不知道我的思路在哪里出了问题,请大家指点?

2011年11月21日 星期一 19:19

这样也可以

 

 

import numpy as np

 

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

 

b=np.array(['a','b','c','d','e','f','g','h','i'])

 

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

 

d = np.vstack((a,b,c))

print d

print d.T

 

2011年11月21日 星期一 22:49

谢谢你,我的本意是将数据格式化为dtype 所预定于的格式。

因为用np.loadtxt()读入的数据访问感觉非常的方便。

想用这个结构来实现一个简易的数据源。

不过都没有成功,不过现在这个写法也是满足需求的。

谢谢你。

我再尝试下,看能不能实现。

2011年11月22日 星期二 08:54

把shape改为-1,1是不行的,你可以用zip(a,b,c)创建这样的列表,然后用np.array将其转换为结构数组:

import numpy as np

 

 

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

b=np.array(["a","b","c","d","e","f","g","h","i"])

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

datatype=np.dtype({

'names':['num','char','len'],

'formats':['i','S32','i']

})

 

d=np.array(zip(a,b,c),dtype=datatype)

 

2011年11月22日 星期二 09:05

或者你可以自己编写一个这样的函数,例如structed_array:

import numpy as np

def structed_array(arrays, names):
    minlen = min((len(a) for a in arrays))
    struct_type = np.dtype({
        'names': names,
        'formats': [a.dtype for a in arrays]
    })

    result = np.zeros(minlen, dtype=struct_type)
    for name, array in zip(names, arrays):
        result[name] = array
    return result

a=np.array([1,2,3,4,5,6,7,8,9])
b=np.array(["a","b","c","d","e","f","g","h","i"])
c=np.array([9,8,7,6,5,4,3,2,1])

d = structed_array((a,b,c), ("a","b","c"))

2011年11月22日 星期二 10:04

谢谢若愚哥哥,

居然没有想到,用零来占位,然后用数据替换的办法来实现。

最后有一点疑惑,

在构建struct_type 时,

 struct_type = np.dtype({
        'names': names,
        'formats': [a.dtype for a in arrays]
    })

这个’names‘的类型是不是因该用list?

d = structed_array((a,b,c), ("a","b","c"))

d = structed_array((a,b,c), ["a","b","c"])

不过两种写法都没有问题。

原因还没有找到。

 

 

2011年11月22日 星期二 11:09

另外savetxt好像是有一个功能将names作为第一行存储在文件了的,

不过忘记是怎么写了,我的numpy是1.3.0的,也没有找到其他的参数,

不知道哪位知道该如何操作?

2011年11月22日 星期二 11:43

我在numpy 1.6中也没有看到savetxt的这个参数,不过你可以自己写:

with file("output.txt", "wb") as f:

f.write(",".join(data.dtype.names) + "\n")

np.savetxt(f, data, delimiter=",")

我查了一下文档,NumPy2.0有这个功能了:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号