python - 属性错误: 'numpy.ndarray' object has no attribute 'cos'

标签 python numpy

我试图找出为什么我的代码中出现上述错误。该程序假设使用牛顿拉夫森方法在给定两个输入参数的情况下查找 4 连杆机构中连杆的位置。

该行发生错误

g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3

预先感谢您的帮助。

import numpy as np

L1=1
L2=1.5 * L1
theta = 40 * np.pi / 180

#initial guesses

L3 = 1.5
alpha = 30 * np.pi / 180
epsilon = 1
n = 0

while epsilon > 0.0001:
    g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3
    dg1dalpha = -L2 * np.sin(alpha)
    dg1dL3 = -1;

    g2 = L1 * np.sin(theta) - L2 * np.sin(alpha)
    dg2dalpha = -L2 * np.cos(alpha);
    dg2dL3 = 0

    J = np.array([[dg1dalpha, dg1dL3], [dg2dalpha, dg2dL3]])

    s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])

    epsilon_alpha = abs(s[0] - alpha)

    epsilon_L3 = abs(s[1] - L3)

    epsilon = max(epsilon_alpha.all, epsilon_L3.all)

    alpha = s[0]

    L3 = s[1]

    n = n + 1

print(n, alpha, L3)

最佳答案

在Python2.7中添加print('alpha',alpha)在循环开始时产生:

('alpha', 0.5235987755982988)
('alpha', array([ 1.85083849,  2.29325173]))
('alpha', array([[array([ 1.98227296,  1.95343536]), 1.7138098231972174],
       [array([ 1.81303794,  1.7604074 ]), 2.2932517265367176]], dtype=object))
Traceback (most recent call last):
  File "stack32444132.py", line 17, in <module>
    g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3
AttributeError: 'numpy.ndarray' object has no attribute 'cos'

所以错误是由调用 np.cos(alpha) 引起的哪里alpha是一个对象数组。 alpha(2,2) ;第一列包含长度为 2 的数组;第二个包含 float 。

因此,在循环中的某个时刻,您要附加或连接不同长度的数组或列表。

s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])
alpha = s[0]

添加更多打印内容(在 s 之前)

('J', (2, 2), dtype('float64'))
('alpha', 0.5235987755982988)
('L3', 1.5)
....
('J', (2, 2), dtype('O'))   
('alpha', array([ 1.85083849,  2.29325173]))
('L3', array([-10.61649234,   1.5       ]))

在第二个循环中J从 2x2 float 矩阵更改为 2x2 对象矩阵。

Python3 在第一次遇到 epsilon = max(epsilon_alpha.all, epsilon_L3.all) 时更早地引发了错误表达。 epsilon_alpha.all是一种方法; epsilon_alpha.all()是一个 bool 值。但即使这样也会在 epsilon_alpha 时产生错误。变成一个数组。

好的,这个循环运行( alpha 仍然是标量);它不会停止,大概是因为epsilon变得不够小;但我会把它留给你。

while epsilon > 0.0001:
    # print('alpha', alpha)
    g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3
    dg1dalpha = -L2 * np.sin(alpha)
    dg1dL3 = -1;

    g2 = L1 * np.sin(theta) - L2 * np.sin(alpha)
    dg2dalpha = -L2 * np.cos(alpha);
    dg2dL3 = 0

    J = np.array([[dg1dalpha, dg1dL3], [dg2dalpha, dg2dL3]])
    print('J', J.shape,J.dtype)  # (2,2) floats
    s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])
    s = s[:,0]  # fudge to turn (2,2) array into a (2,) array

    epsilon_alpha = abs(s[0] - alpha)
    epsilon_L3 = abs(s[1] - L3) 
    epsilon = max(epsilon_alpha, epsilon_L3)
    # max on 2 scalars is ok

    alpha = s[0] # scalar
    L3 = s[1]    # scalar
    n = n + 1

问题的根源在于

 s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])

如果alphaL3是标量,则 np.array([[alpha], [L3]])(2,1)np.array([[g1], [g2]])也是如此。但自从 J是 (2,2), s也是(2,2)。但你一直在使用s[0]s[1] ,显然假设s是`(2,)。

 s = s[:,0] 

使s a (2,) 所以代码的其余部分可以工作。自 epsilon不收敛,这可能是错误的修复。

我可以强调一下 - 开发时 numpy代码中,请密切注意数组形状。如果形状错误,你会得到这样的错误。根据我的经验,获得正确的形状占调试工作的 80%。

关于python - 属性错误: 'numpy.ndarray' object has no attribute 'cos' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444132/

相关文章:

python - 用 Python 编写 Komodo Edit 扩展

python - pip freeze > requirements.txt 包括 virtualenv 中的所有系统安装包

python - 如何在 PyMySQL 中编写使用当前系统时间的查询?

python - 为什么 NumPy 数组这么快?

python - numpy 数组中每个元素的邻居加权数组

python - 内置计算协方差的函数

python - 如何使用 Python boto3 检索 VPC ID 和子网 ID?

python - 过滤二维数组并从中间返回坐标

arrays - Numpy - 索引多维数组的一维

python - 将非零 numpy 数组元素附加到列表的最快方法