尝试修复 NumPy asscalar 弃用问题

问题描述 投票:0回答:2

在尝试更新旧的 Python 脚本时,我遇到了以下错误:

module 'numpy' has no attribute 'asscalar'. Did you mean: 'isscalar'?

具体:

def calibrate(x, y, z):
  # H = numpy.array([x, y, z, -y**2, -z**2, numpy.ones([len(x), 1])])
  H = numpy.array([x, y, z, -y**2, -z**2, numpy.ones([len(x)])])
  H = numpy.transpose(H)
  w = x**2
  
  (X, residues, rank, shape) = linalg.lstsq(H, w)
  
  OSx = X[0] / 2
  OSy = X[1] / (2 * X[3])
  OSz = X[2] / (2 * X[4])
  
  A = X[5] + OSx**2 + X[3] * OSy**2 + X[4] * OSz**2
  B = A / X[3]
  C = A / X[4]
  
  SCx = numpy.sqrt(A)
  SCy = numpy.sqrt(B)
  SCz = numpy.sqrt(C)
  
  # type conversion from numpy.float64 to standard python floats
  offsets = [OSx, OSy, OSz]
  scale = [SCx, SCy, SCz]
  
  offsets = map(numpy.asscalar, offsets)
  scale = map(numpy.asscalar, scale)
  
  return (offsets, scale)

我发现

asscalar
自 NumPy 1.16 起已被弃用。我发现一篇参考文献说要使用
numpy.ndarray.item
,但我不知道如何做到这一点。

我确实尝试过这个:

offsets = map.item(offsets)
scale = map.item( scale)

但出现此错误:

AttributeError: type object 'map' has no attribute 'item'

我该如何解决这个问题?

python numpy numpy-ndarray deprecation-warning
2个回答
2
投票

只需将

numpy.scalar
替换为
numpy.ndarray.item
,即改变

offsets = map(numpy.asscalar, offsets)
scale = map(numpy.asscalar, scale)

offsets = map(numpy.ndarray.item, offsets)
scale = map(numpy.ndarray.item, scale)

0
投票

假设

X
是形状为 (6,) 的一维数组,我创建了一个虚拟样本,并应用了您的计算(通过第一个偏移)

X = np.array([1, 2.3, 3.2, .4,5.2, 3])

并得到两个 numpy 标量列表。

In [58]: offsets
Out[58]: [0.5, 2.8749999999999996, 0.3076923076923077]
In [59]: type(offsets[0])
Out[59]: numpy.float64

看起来

map
行是 Python 2,旨在生成常规 Python 浮点数列表。 Python 3 将使用
list(map(...))

item
是 numpy 标量(和单项数组)的一种方法。它可以用作:

In [60]: [OSx.item(), OSy.item(), OSz.item()]
Out[60]: [0.5, 2.8749999999999996, 0.3076923076923077]
In [61]: [i.item() for i in offsets]
Out[61]: [0.5, 2.8749999999999996, 0.3076923076923077]

一个将其应用于 OS 值,然后将其收集到列表中,另一个使用列表理解(这比

map
更容易使用,至少对于此而言)。

同样适用于

scale

但是对于

scale
,我们不需要单独取 sqrt;只需从 3 个值创建一个数组,将 sqrt 应用于整个数组。然后使用
tolist()
方法创建 python 浮点数列表。这比尝试单独执行 sqrt 和 item 更好。

In [63]: np.sqrt(np.array([A,B,C]))
Out[63]: array([2.65491199, 4.19778444, 1.16425593])
In [64]: np.sqrt(np.array([A,B,C])).tolist()
Out[64]: [2.6549119933262744, 4.197784443104389, 1.1642559271506094]
© www.soinside.com 2019 - 2024. All rights reserved.