【问题标题】:python 3 and numpy arraypython 3和numpy数组
【发布时间】:2016-01-06 22:00:27
【问题描述】:

我正在尝试编写代码来处理数组。我有变量数组,我试图从这些变量中调用某些数字来定义函数。我附上了我要完成的工作的简化片段。当我只将变量作为单个数字时,代码可以正常工作,但是当我合并数组时它就不起作用了。

import numpy as np

noe = 3


# E of members ksi
E = 29000*np.ones((1, noe))
# Area of members in^2
A = 1000*np.array([20, 30, 20])
# length of members in
L = np.array([144, 240, 144])
# moment of inertia of members in^4
I = np.array([600, 1200, 600])

def k_frame_local_6x6(E, I, A, L):
    return (E/L)*np.array([[A, 0, 0, -A, 0, 0], [0, (12*I)/(L**2), (6*I)/L, 0, (-12*I)/(L**2), (6*I)/L], [0, (6*I)/L, 4*I, 0, (-6*I)/L, 2*I], [-A, 0, 0, A, 0, 0], [0, (-12*I)/(L**2), (-6*I)/L, 0, (12*I)/(L**2), (-6*I)/L], [0, (6*I)/L, 2*I, 0, (-6*I)/L, 4*I]])


m=k_frame_local_6x6(E[0, 1], I[0, 1], A[0, 1], L[0, 1])

print(m)

我收到的错误是“IndexError: too many indices for array”

当我手动输入值时,我试图让函数读取它,它看起来像这样:

def k_frame_local_6x6(E, I, A, L):
    return (E/L)*np.array([[A, 0, 0, -A, 0, 0], [0, (12*I)/(L**2), (6*I)/L, 0, (-12*I)/(L**2), (6*I)/L], [0, (6*I)/L, 4*I, 0, (-6*I)/L, 2*I], [-A, 0, 0, A, 0, 0], [0, (-12*I)/(L**2), (-6*I)/L, 0, (12*I)/(L**2), (-6*I)/L], [0, (6*I)/L, 2*I, 0, (-6*I)/L, 4*I]])

m=k_frame_local_6x6(29000, 1200, 30000, 240)

print(m)

我得到的结果是:

[[  3.62500000e+06   0.00000000e+00   0.00000000e+00  -3.62500000e+06
    0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   3.02083333e+01   3.62500000e+03   0.00000000e+00
   -3.02083333e+01   3.62500000e+03]
 [  0.00000000e+00   3.62500000e+03   5.80000000e+05   0.00000000e+00
   -3.62500000e+03   2.90000000e+05]
 [ -3.62500000e+06   0.00000000e+00   0.00000000e+00   3.62500000e+06
    0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00  -3.02083333e+01  -3.62500000e+03   0.00000000e+00
    3.02083333e+01  -3.62500000e+03]
 [  0.00000000e+00   3.62500000e+03   2.90000000e+05   0.00000000e+00
   -3.62500000e+03   5.80000000e+05]]

我刚刚注意到的一件事是我的数组有两组括号:

E = 29000*np.ones((1, noe))

结果是:

array([[ 29000.,  29000.,  29000.]])

但是对于其余的数组,我只得到一组括号:

A = 1000*np.array([20, 30, 20])

给我:

array([20000, 30000, 20000])

如果我需要澄清其他任何事情,请告诉我。谢谢大家!!!

【问题讨论】:

  • 抱歉,我无法理解您写的内容。您能否发布不起作用的脚本、预期的输出和您遇到的错误?
  • A, IL 是一维数组,例如。 A[0, 1] 失败。看看NumPy Indexing
  • 这次我回到我的电脑后,我会再次重新发布,更清晰一些

标签: python arrays python-3.x numpy


【解决方案1】:

你的k_frame_local_6x6 - 对于普通人来说很难看,几乎无法阅读,当给定 4 个数字时会产生一个 6x6 数组。

但据我所知,没有一个术语是为使用数组而设计的:

def k_frame_local_6x6(E, I, A, L):
    temp = np.array([[A, 0, 0, -A, 0, 0], 
                     [0, (12*I)/(L**2), (6*I)/L, 0, (-12*I)/(L**2), (6*I)/L], 
                     [0, (6*I)/L, 4*I, 0, (-6*I)/L, 2*I], 
                     [-A, 0, 0, A, 0, 0], 
                     [0, (-12*I)/(L**2), (-6*I)/L, 0, (12*I)/(L**2), (-6*I)/L], 
                     [0, (6*I)/L, 2*I, 0, (-6*I)/L, 4*I]
                     ])
     return (E/L)*temp

试试,例如最简单的一行字

np.array([-A, 0,0,A,0,0])

如果A 是一个数字,那很好。但如果A 是一个数组,它就不起作用。好吧,它确实有效,但没有返回有意义的东西

In [105]: A = 1000*np.array([20, 30, 20])

In [106]: np.array([A, 0, 0, -A, 0, 0])
Out[106]: 
array([array([20000, 30000, 20000]), 0, 0, array([-20000, -30000, -20000]),
       0, 0], dtype=object)

您尝试传递A[0, 1]。你试过这种表达方式吗?

In [107]: A[0,1]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-107-33f18b7a38c5> in <module>()
----> 1 A[0,1]

IndexError: too many indices

In [108]: A.shape
Out[108]: (3,)

它不起作用,因为A 被定义为 1d 3 元素数组。您不能使用 2 个值对其进行索引。

E 被定义为 2d 数组,但其余的都是 1d。这是故意的,还是错误的?

您似乎在不了解numpy 数组创建和索引的基础知识的情况下就开始定义复杂数组。还是您来自一个一切都是二维(或更多)的 MATLAB 世界?在 numpy 数组中可以是 1d。

【讨论】:

  • 哈哈,你抓住了我。我来自 MATLAB。我正在攻读结构工程硕士学位,我们将 MATLAB 用于所有学术工作,但很多人告诉我,由于价格原因,公司很少使用 MATLAB。我正在尝试将我的 MATLAB 代码转换为 Python。变量 E、A、I 和 L 是对应于单个元素的 1xn 矩阵。该函数将进入一个while循环并创建一个3D矩阵(6x6xnum_of_elements)。
  • @JustinKordas 您可以使用 np.r_ 来模拟 MATLAB 的 [] 数组构造语法,例如np.r_[A, 0, 0, -A, 0, 0]。另外,请阅读this
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2012-09-11
  • 2020-09-06
  • 2013-06-01
相关资源
最近更新 更多