PYTHON / NUMPY:如何在循环中将各种数据类型分配给数据类型对象numpy.dtype()

时间:2017-03-07 18:00:00

标签: python arrays numpy dictionary

我想使用numpy.dtype()对象构造一个具有各种不同数据类型的numpy数组。

我有一本字典' mydict'在存储有关数据的所有信息的地方,我想用它创建一个数据类型对象dt。 ' mydict'是根据我选择的属性动态创建的,数据类型也与属性对应!

import numpy as np

mydict={'name0': 'mass', 'name1': 'position', 'name2': 'ID', 
      'format0': np.float32, 'format1': np.int8, 'format2': np.uint64}

数据类型对象dt应该如下所示

dt = np.dtype([('mass', np.float32), ('position', np.int8), ('ID', np.uint64)])

我的问题是如何创建dt而不将其手动构建/编写到代码中?

主要问题是我不知道如何将np.dtype()附加到' name'和'格式'组合或如果可能的话......

我正在使用dt然后将我的数据读入这样的numpy数组中!

data_array=np.array((nr_rows, nr_cols)), dtype=dt)

我尝试过使用Dict Comprehensions,list和dictionaries的某些尝试,但我找不到正确的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

In [209]: dd={'name0': 'mass', 'name1': 'position', 'name2': 'ID', 
     ...:       'format0': np.float32, 'format1': np.int8, 'format2': np.uint64}

In [213]: [(dd['name%s'%i],dd['format%s'%i]) for i in range(3)]
Out[213]: [('mass', numpy.float32), ('position', numpy.int8), ('ID', numpy.uint64)]

In [214]: dt=np.dtype([(dd['name%s'%i],dd['format%s'%i]) for i in range(3)])
In [216]: arr = np.zeros((2,), dt)
In [217]: arr
Out[217]: 
array([( 0., 0, 0), ( 0., 0, 0)], 
      dtype=[('mass', '<f4'), ('position', 'i1'), ('ID', '<u8')])

答案 1 :(得分:0)

如果你的密钥遵循问题中的严格模式,你可以看看这个; 1)提取键以 name 开头的值,并将它们设置为元组的第一个元素; 2)用格式替换 name ,并提取相应的值作为元组的第二个元素; 3)从元组列表中构造dtype。

<div id="addEdit" style="width 100%; height 100%; background-color #fff;">
    <div class="demo-section k-content">
        <ul class="fieldlist">
           <li>
                <label for="simple-input" >Employee Number</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">ForeName</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">ForeName</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Surname</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Preferred Name</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input" class="form-horizontal">Language</label>
                <input id="language" class="form-horizontal" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Country</label>
                <input id="country" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Time Zone</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Domain</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Network Id</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Email Address</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>
                <label for="simple-input">Status</label>
                <input id="simple-input" type="text" class="k-textbox" style="width: 40%;" />
            </li>
            <li>

                <button id="btnCancel" class="k-button">Cancel</button>&nbsp;
                <button class="k-button k-primary">Save</button>
            </li>




        </ul>
        <style>
            .fieldlist {
                margin: 0 0 -2em;
                padding: 0;
            }

                .fieldlist li {
                    list-style: none;
                    padding-bottom: 2em;
                }

                .fieldlist label {
                    display: block;
                    padding-bottom: 1em;
                    font-weight: bold;
                    text-transform: uppercase;
                    font-size: 10px;
                    color: #444;
                }
        </style>
    </div>




</div>

注意:您最初可能需要OrderDict才能在此处获得正确的列顺序。