将平坦的numpy数组复制到np.array对象的给定属性

时间:2016-09-17 11:59:58

标签: python arrays numpy

我可以将1D numpy数组复制到np.array对象的给定属性而不使用for循环吗? 为了使用“dist”数组填充objarray中所有PlotInputGridData对象的“percentage”属性,我使用如下内容:

import numpy as np

class PlotInputGridData(object):
    def __init__(self):
        self.rangemin = 0
        self.rangemax = 0
        self.rangelabel = ''
        self.percentage = 0
        self.number = 0

objarray = np.arange(6, dtype=PlotInputGridData)
for i in range(objarray.size):
    t = PlotInputGridData()
    objarray[i] = t

dist = np.array([52, 26, 12, 6, 3, 1], dtype=np.int)

for i in range(dist.size):
    objarray[i].percentage = dist[i]

我需要做

  • objarray [0] .percentage = dist [0]
  • objarray [1] .percentage = dist [1]
  • ......等等

有没有办法将dist []复制到objarray []。百分比以更简洁的方式在最后2行没有for循环?

1 个答案:

答案 0 :(得分:3)

如果没有for-loop,我认为没有办法完成这项任务。

如果您使用structured array而不是对象数组,则可以执行此操作。类PlotInputGridData只是几个字段,因此它所包含的数据很容易表示为结构化数据类型而不是Python类。

例如,

In [15]: grid_data_type = np.dtype([('rangemin', float),
    ...:                            ('rangemax', float),
    ...:                            ('rangelabel', 'S16'),
    ...:                            ('percentage', float),
    ...:                            ('number', int)])

grid_data_type是一个包含五个字段的结构化数据类型。 (根据需要更改各个字段的类型。)此数据类型可用作numpy数组的dtype

In [16]: a = np.zeros(6, dtype=grid_data_dtype)

In [17]: dist = np.array([52, 26, 12, 6, 3, 1])

以下内容将数组dist分配给'percentage'字段:

In [18]: a['percentage'] = dist

看看a

In [19]: a
Out[19]: 
array([(0.0, 0.0, b'', 52.0, 0), (0.0, 0.0, b'', 26.0, 0),
       (0.0, 0.0, b'', 12.0, 0), (0.0, 0.0, b'', 6.0, 0),
       (0.0, 0.0, b'', 3.0, 0), (0.0, 0.0, b'', 1.0, 0)], 
      dtype=[('rangemin', '<f8'), ('rangemax', '<f8'), ('rangelabel', 'S16'), ('percentage', '<f8'), ('number', '<i8')])

In [20]: a[0]
Out[20]: (0.0, 0.0, b'', 52.0, 0)

In [21]: a['percentage']
Out[21]: array([ 52.,  26.,  12.,   6.,   3.,   1.])