尝试修复Python Numpy ascaral弃用问题需要帮助

nfzehxib  于 2023-05-07  发布在  Python
关注(0)|答案(2)|浏览(308)

在尝试更新旧的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)

在谷歌上搜索一下(包括阅读StackOverflow上的一些帖子),发现自1.16以来,asscalar已经被弃用。有没有找到一个引用说要使用numpy.ndarray.item,但不知道如何做到这一点?注意,我不是Python程序员-只知道足够的东西。
我试过这个:

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

但是得到了这个错误:属性错误:类型对象“map”没有属性“item”
也试过其他几个,但总是有某种形式的错误。

abithluo

abithluo1#

只需将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)
jw5wzhpr

jw5wzhpr2#

假设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值被收集到列表中之前将其应用于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]

相关问题