我刚刚发现了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]
不是数组,而是标量。是否有可能以比我所描述的方式更优雅的方式创建结构化标量?
答案 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))
。