创建Numpy结构标量而不是数组

时间:2017-12-11 15:03:51

标签: python numpy

我刚刚发现了Numpy结构化数组,我发现它们非常强大。在我的脑海中出现了一个自然的问题:我如何在世界上创建一个Numpy结构标量。让我告诉你我的意思。假设我想要一个包含一些数据的结构:

import numpy as np
dtype = np.dtype([('a', np.float_), ('b', np.int_)])
ar = np.array((0.5, 1), dtype=dtype)
ar['a']

这为我array(0.5)而不是0.5。另一方面,如果我这样做:

import numpy as np
dtype = np.dtype([('a', np.float_), ('b', np.int_)])
ar = np.array([(0.5, 1)], dtype=dtype)
ar[0]['a']

我得到0.5,就像我想要的那样。这意味着ar[0]不是数组,而是标量。是否有可能以比我所描述的方式更优雅的方式创建结构化标量?

2 个答案:

答案 0 :(得分:3)

使用np.asscalar
在两种情况下,它都只是np.asscalar(ar['a'])

此外,您可能会发现有用的np.item

答案 1 :(得分:1)

Singleton不是一个合适的词,但我得到了你想要的东西。

arr = np.array((0.5, 1), dtype=dtype)

创建此dtype的0d单元素数组。检查它的类型和形状。

arr.item()返回元组(0.5, 1)。 Aso测试arr[()]arr.tolist()

np.float64(0.5)创建一个带有numpy包装器的float。它类似于np.array(0.5),但与In [123]: dt = np.dtype('i,f,U10') In [124]: dt Out[124]: dtype([('f0', '<i4'), ('f1', '<f4'), ('f2', '<U10')]) In [125]: arr = np.array((1,2,3),dtype=dt) In [126]: arr Out[126]: array((1, 2., '3'), dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<U10')]) In [127]: arr.shape Out[127]: () 完全相同。他们的方法不同。

我不知道任何与化合物dtype相似的东西。

arr

In [128]: arr[()] Out[128]: (1, 2., '3') In [129]: type(_) Out[129]: numpy.void 是一个0d 1元素数组。它可以用以下索引编号:

np.void

此索引会生成np.float个对象。在0d float数组上执行相同操作将生成np.void((1,2,3), dtype=dt)对象。

但您无法使用np.float(12.34)直接创建此类对象(与item相反)。

arr是提取“标量”的正常方式。从一个数组。这里它返回一个元组,我们用作创建In [131]: arr.item() Out[131]: (1, 2.0, '3') In [132]: type(_) Out[132]: tuple 的输入的同类对象:

np.asscalar(arr)

np.void返回相同的元组。

arr[()]['f0']对象和元组之间的一个区别是,它仍然可以使用字段名arr.item()[0]编制索引,而元组必须使用数字void编制索引。 dtype仍然有fromrecords,而元组则没有。{/ p>

recarray成了numpy。这类似于结构化数组,但允许我们作为属性访问字段。它实际上可能是一个较旧的类,已合并到np.rec,因此np.rec前缀。我们大多使用结构化数组,但numpy.lib.recfunctions仍然有一些便利功能。 (实际上在In [133]: res = np.rec.fromrecords((1,2,3), dt) In [134]: res Out[134]: rec.array((1, 2., '3'), dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<U10')]) In [135]: res.f0 Out[135]: array(1, dtype=int32) In [136]: res.item() Out[136]: (1, 2.0, '3') In [137]: type(_) Out[137]: tuple In [138]: res[()] Out[138]: (1, 2.0, '3') In [139]: type(_) Out[139]: numpy.record ):

np.record

因此,这产生了np.void而不是In [143]: numpy.record.__mro__ Out[143]: (numpy.record, numpy.void, numpy.flexible, numpy.generic, object) 。但那只是一个子类:

In [145]: arr['f1']
Out[145]: array(2.0, dtype=float32)
In [146]: arr[()]['f1']
Out[146]: 2.0
In [147]: type(_)
Out[147]: numpy.float32

按字段名称访问结构化数组会给出相应dtype(和相同形状)的数组

Out[146]

np.float32(2.0)也可以使用ar[0]创建。

检查我对1d数组的In [158]: arr1d = np.array([(1,2,3)], dt) In [159]: arr1d Out[159]: array([(1, 2., '3')], dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<U10')]) In [160]: arr1d[0] Out[160]: (1, 2., '3') In [161]: type(_) Out[161]: numpy.void 的评论:

arr[()]

因此arr1d[0]arr2d[0,0]对各自大小的数组执行相同的操作。同样arr2d[(0,0)],也可以写为def tanh(x): for i in range(len(x)): x[i]=(np.exp(2*x[i])-1)/(np.exp(2*x[i])+1) return x def single_layer_perceptron(x): w = np.random.random(x.shape) result=np.dot(x, w) return tanh(result) arr=np.arange(10) print(arr) result_list=[] for i in range(10000): result_list.append(single_layer_perceptron(arr)) result_array=np.array(result_list) print(np.mean(result_array)) print(np.std(result_array))