首页 > 编程问答 >如何构建一维数组的二维数组的特定 Python 结构?

如何构建一维数组的二维数组的特定 Python 结构?

时间:2024-07-23 05:39:12浏览次数:9  
标签:python arrays

如何构建一维数组(即行向量)的二维数组的特定结构以满足特定 我正在维护的遗留程序的结构?

我可以在此结构中生成正确的内容

all_measurements[:12]
array([[0.   , 0.   , 0.   , 2.   ],
       [0.02 , 0.334, 0.04 , 2.24 ],
       [0.04 , 0.668, 0.08 , 2.48 ],   .....

但程序需要在此结构中

array([array([[0.   , 0.   , 0.   , 2.   ]]),
       array([[0.02 , 0.334, 0.04 , 2.24 ]]),
       array([[0.04 , 0.668, 0.08 , 2.48 ]]),

这是我当前正在使用的代码

import numpy as np

dt = 1/50; nt = 350
Vh = 16.7; Vv = 20.6; Vy = 2
gg = -10; v0 = +2

it = np.arange(nt)
ts = dt * it

all_measurements = []

for i in range(12):
    row = np.array([ts[i], Vh*ts[i], Vy*ts[i], (v0 + ts[i]*(Vy - gg))])
    all_measurements.append(row)

all_measurements = np.array(all_measurements)

上面的代码生成测试用例数据,但解析器拒绝这种格式的数据,并显示错误消息

数组索引太多:数组是一维的,但索引了 2 个 测量[row_list[np.where(column_list == i)[0]],:])

根据我下面的评论,它已通过将循环调整为

for i in range(nt):
    row = np.array([np.array([ts[i], Vh*ts[i], Vy*ts[i], (v0 + ts[i]*(Vy - gg *ts[i]))])])
    all_measurements.append(row)

按照问题解决,我知道行数很小(100 到低 1000),但是将 all_measurements 初始化为空列表,然后迭代附加在内存管理和原始机器周期方面不是非常低效吗?


可以使用 NumPy 的各种数组操作方法,更有效地构建所需的结构,而无需使用循环追加。以下介绍三种方法:

方法 1:使用 reshape newaxis

import numpy as np

dt = 1/50; nt = 350
Vh = 16.7; Vv = 20.6; Vy = 2
gg = -10; v0 = +2

it = np.arange(nt)
ts = dt * it

# 使用广播计算所有值
all_measurements = np.array([ts, Vh*ts, Vy*ts, (v0 + ts*(Vy - gg))])

# 调整数组形状
all_measurements = all_measurements[:,:12]  # 取前12列
all_measurements = all_measurements.reshape(-1, 1, 4) # 调整为 (12, 1, 4)

这种方法首先使用广播一次性计算所有时间点的值,然后使用切片提取前 12 列,最后使用 reshape 将其调整为所需的 (12, 1, 4) 形状。

方法 2:使用嵌套列表推导

all_measurements = np.array([[[ts[i], Vh*ts[i], Vy*ts[i], (v0 + ts[i]*(Vy - gg))] for i in range(12)]])

这种方法使用嵌套列表推导式,直接构建所需的嵌套列表结构,然后使用 np.array 将其转换为 NumPy 数组。

方法 3:使用 expand_dims

all_measurements = []
for i in range(12):
    row = np.array([ts[i], Vh*ts[i], Vy*ts[i], (v0 + ts[i]*(Vy - gg))])
    all_measurements.append(row)

all_measurements = np.array(all_measurements)

# 使用 expand_dims 添加维度
all_measurements = np.expand_dims(all_measurements, axis=1) 
all_measurements = all_measurements[:12]

这种方法先按照之前的循环方式生成数据,然后使用 np.expand_dims 在指定轴上添加维度,最后使用切片获取前12个元素。

这三种方法都避免了循环追加,并且更加高效。其中,方法 1 最为简洁高效,因为它利用了 NumPy 的广播机制,一次性计算所有值。方法 2 更容易理解,但可能在处理大量数据时效率略低。 方法 3 允许在现有代码的基础上进行修改,更加灵活。可以根据实际情况选择合适的方法。

标签:python,arrays
From: 78780767

相关文章

  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......
  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......
  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......
  • 如何使用 Selenium Python 搜索 Excel 文件中的文本
    我有一些数据在Excel文件中。我想要转到Excel文件,然后搜索文本(取自网站表),然后获取该行的所有数据,这些数据将用于在浏览器中填充表格。示例:我希望selenium搜索ST0003然后获取名称,该学生ID的父亲姓名,以便我可以在大学网站中填写此信息。我想我会从网站......