python 命名数组_在Python 2.7.3中为numpy数组指定字段名称

In [1]: data = np.array([[1,12.3]])

In [2]: dt = np.dtype({'names': ['1st','f8']})

你的尝试:

In [3]: np.array(data,dt)

Out[3]:

array([[(1.0,1.0,1.0),(2.0,2.0,2.0),(3.0,3.0,3.0)],[(4.0,4.0,4.0),(5.0,5.0),(6.0,6.0,6.0)],[(11.0,11.0,11.0),(12.0,12.0,12.0),(12.3,12.3,12.3)]],dtype=[('1st','

生成一个(3,3)数组,并为每个字段分配相同的值. data.astype(dt)做同样的事情.

但是view会生成一个(3,1)数组,其中每个字段都包含一列的数据.

In [4]: data.view(dt)

Out[4]:

array([[(1.0,'

我应该提醒一下,只有当所有字段都与原始字段具有相同的数据类型时,该视图才有效.它使用相同的数据缓冲区,只是以不同的方式解释值.

您可以将结果从(3,1)重新整形为(3,).

但是既然你想要A [‘1st’]是[1,3] – 一行数据 – 我们必须做一些其他操作.

In [16]: data.T.copy().view(dt)

Out[16]:

array([[(1.0,11.0)],[(2.0,12.0)],[(3.0,'

我转置,然后复制(重新安排底层数据缓冲区).现在一个视图将[1,3]放在一个字段中.

请注意,结构化数组的显示使用()而不是[]来表示“行”.这是它如何接受输入的线索.

我可以将您的数据转换为元组列表:

In [19]: [tuple(i) for i in data.T]

Out[19]: [(1.0,12.300000000000001)]

In [20]: np.array([tuple(i) for i in data.T],dt)

Out[20]:

array([(1.0,12.3)],'

这是一个包含3个字段的(3)数组.

元组列表是向np.array(…,dt)提供数据的常规方式.请参阅我的评论中的doc链接.

您还可以创建一个空数组,逐行填充,或逐个字段填充

In [26]: A=np.zeros((3,),dt)

In [27]: for i in range(3):

....: A[i]=data[:,i].copy()

没有副本我得到一个ValueError:ndarray不是C-contiguous

按字段填写:

In [29]: for i in range(3):

....: A[dt.names[i]]=data[i,:]

通常,结构化数组有许多行和几个字段.所以按场填充相对较快.这就是重新排列函数处理大多数复制任务的方式.

fromiter也可以使用:

In [31]: np.fromiter(data,dtype=dt)

Out[31]:

array([(1.0,3.0),(4.0,6.0),(11.0,'

但是我在使用没有副本的data.T时得到的错误是一个强有力的指示,即逐行迭代(我的[27])

In [32]: np.fromiter(data.T,dtype=dt)

ValueError: ndarray is not C-contiguous

zip(* data)是重新排序输入数组的另一种方式(请参阅注释链接中的@ unutbu的答案).

np.fromiter(zip(*data),dtype=dt)

正如评论中指出的那样,fromarrays有效:

np.rec.fromarrays(data,dt)

这是使用by字段复制方法的rec函数的示例:

arrayList = [sb.asarray(x) for x in arrayList]

....

_array = recarray(shape,descr)

# populate the record array (makes a copy)

for i in range(len(arrayList)):

_array[_names[i]] = arrayList[i]

在我们的案例中是:

In [8]: data1 = [np.asarray(i) for i in data]

In [9]: data1

Out[9]: [array([ 1.,3.]),array([ 4.,5.,6.]),array([ 11.,12.,12.3])]

In [10]: for i in range(3):

A[dt.names[i]] = data1[i]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值