【问题标题】:ctypes - numpy array with no shape?ctypes - 没有形状的numpy数组?
【发布时间】:2016-01-21 18:10:04
【问题描述】:

我正在使用 python 包装器来调用 c++ dll 库的函数。 dll 库返回一个 ctype,我将其转换为 numpy 数组

score = np.ctypeslib.as_array(score,1) 

但是,数组没有形状?

score
>>> array(-0.019486344729027664)

score.shape
>>> ()

score[0]
>>> IndexError: too many indices for array

如何从分数数组中提取双精度数?

谢谢。

【问题讨论】:

  • 那是一个形状;它的形状 (),又名 0 维。
  • 非常感谢。有什么方法可以提取数组内的双精度数吗?我想这是最后的问题
  • 您可以使用float(score)。但是你怎么会得到一个 0 维数组,即 score 的初始类型和值是什么?
  • 你为什么在这件事上打电话给np.ctypeslib.as_array1 不是一个有效的形状,如果只有一个值,为什么要使用 np.ctypeslib.as_array 来检索它?为什么不通过正常的 ctypes 界面呢?
  • shape 参数仅用于指针,因此我们知道score 最初不是指针,否则传递shape=1 将是错误的。如果您将as_array 传递给c_double(-0.19) 之类的标量,它会将__array_interface__ 属性存储在c_double 类型和shape=() 上。然而,在 NumPy 1.8.2 中,这实际上创建了一个带有shape=(1,) 的数组。也许在旧版本中它会创建一个标量“数组”。

标签: python arrays numpy ctypes dimensions


【解决方案1】:

您可以通过索引[()] 访问零维数组中的数据。

例如,score[()] 将检索您数组中的基础数据。

成语其实是一致的:

# x, y, z are 0-dim, 1-dim, 2-dim respectively
x = np.array(1)
y = np.array([1, 2, 3])
z = np.array([[1, 2, 3], [4, 5, 6]])

# use 0-dim, 1-dim, 2-dim tuple indexers respectively
res_x = x[()]      # 1
res_y = y[(1,)]    # 2
res_z = z[(1, 2)]  # 6

元组看起来不自然,因为您不需要将它们显式用于 1d 和 2d 情况,即 y[1]z[1, 2] 就足够了。该选项不适用于 0-dim 的情况,因此请使用长度为零的元组。

【讨论】:

  • 这是什么魔法?
  • () 是一个长度为 0 的元组。它与旧的 array[(3, 4)] 完全一样的操作。
  • 另外,对于具有单个值的数组,array.item() 将返回一个标量,而不管它的维度如何。 np.array(0).item() == np.atleast_3d(0).item().
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
相关资源
最近更新 更多