我刚刚发现了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条答案
按热度按时间1wnzp6jl1#
“单身”这个词不太合适,但我明白你的意思。
创建此数据类型的第0d个单元素数组。检查其dtype和形状。
arr.item()
返回元组(0.5, 1)
。阿索测试arr[()]
和arr.tolist()
。np.float64(0.5)
使用numpy Package 器创建一个float。它类似于np.array(0.5)
,但不完全相同。他们的方法有些不同。我不知道任何类似于复合dtype的东西。
arr
是一个0d 1元素数组。可以使用以下索引:这个索引生成一个
np.void
对象。对0d浮点数组执行相同的操作将生成np.float
对象。但是不能使用
np.void((1,2,3), dtype=dt)
直接创建这样的对象(与np.float(12.34)
相反)。item
是从数组中提取“标量”的常规方法。在这里,它返回一个元组,与我们用来创建arr
的输入对象相同:np.asscalar(arr)
返回相同的元组。np.void
对象和元组之间的一个区别是,它仍然可以用字段名arr[()]['f0']
索引,而元组必须用数字arr.item()[0]
索引。void
仍然有dtype
,而元组没有。fromrecords
生成recarray
。这类似于结构化数组,但允许我们将字段作为属性访问。它实际上可能是一个较旧的类,已合并到numpy
中,因此前缀为np.rec
。大多数情况下,我们使用结构化数组,尽管np.rec
仍然有一些方便的函数。(实际在numpy.lib.recfunctions
中):所以这产生了
np.record
而不是np.void
。但这只是一个子类:通过字段名访问结构化数组会得到一个具有相应dtype(和相同形状)的数组
Out[146]
也可以用np.float32(2.0)
创建。检查我对1d数组的
ar[0]
的评论:所以
arr[()]
和arr1d[0]
对它们各自大小的数组执行相同的操作。arr2d[0,0]
也可以写成arr2d[(0,0)]
。pxy2qtax2#
使用np.asscalar。
在这两种情况下,它都只是
np.asscalar(ar['a'])
。另外,您可能会发现有用的np.item。