在尝试更新旧的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”
也试过其他几个,但总是有某种形式的错误。
2条答案
按热度按时间abithluo1#
只需将
numpy.scalar
替换为numpy.ndarray.item
,即更改到
jw5wzhpr2#
假设
X
是一个形状为(6,)的一维数组,我创建了一个虚拟示例,并应用了您的计算(通过第一个偏移)得到了两个numpy标量列表。
看起来
map
行是Python 2,旨在生成常规Python浮点数的列表。Python 3将使用list(map(...))
。item
是一个numpy标量(和单项数组)的方法。它可以用作:一种是在OS值被收集到列表中之前将其应用于OS值,另一种是使用列表解析(它比
map
更容易使用,至少在这方面)。scale
也是如此。但是对于
scale
,我们不需要单独使用sqrt;只需从3个值中创建一个数组,将sqrt应用于整个数组。然后使用tolist()
方法创建一个python浮点数列表。这比尝试分别处理sqrt和item要好得多。