Python相当于在Matlab中分配给一个数组(在for循环内)
Posted
技术标签:
【中文标题】Python相当于在Matlab中分配给一个数组(在for循环内)【英文标题】:Python equivalent to assigning to an array (inside for loop) in Matlab 【发布时间】:2016-03-21 12:35:16 【问题描述】:这是一个非常简单的问题,我已经写了很多,以防人们在“为什么这不起作用?”中发现这个问题比我晚了几个小时。训练,帮助他们
在 Matlab 中,以下代码将创建一个动态增加的数组:
for i = 1:5
array(i) = i*2;
end
但我在 Python 的复杂性方面遇到了一些问题。以下确实有效,但不是我想要的:
i = []
array = []
for i in range(1, 5):
array.append(i*2)
这可行,但是您只能追加到末尾。您还可以将值分配给已经存在的单元格范围 - 不仅仅是“将它们粘贴在末尾”(即下面的代码可以替换 100 个单元格长列表中的单元格 14-36)
i = []
array = list(xrange(1,100)) #creates list from 1 to 99
for i in range(14, 36):
array[i] = i*2 #assign and overwrite previous cell values
这里是否有一些将两者结合起来的包罗万象的编码方法?以下代码的解决方案:
i = []
array = list(xrange(1,50)) #creates list from 1 to 49
for i in range(34, 66):
array[i] = i*2
错误信息:
IndexError: list assignment index out of range
到目前为止我看到的一般差异:
Python 从单元格编号 [0] 而不是 [1] 开始 您无法动态更新列表大小,因此您需要使用附加功能 (可能?)在使用列表之前需要预先分配列表** 其他人的注意事项:
经常出现的一个错误是:
TypeError: 'builtin_function_or_method' object does not support item assignment
这是由于试图分配这样的值:
array.append[i-1] = i*2
向上查看正确的方法。
杂项
感谢您的帮助!我确信这真的很简单,但是我已经没有想法了,在之前的问题中找不到解决方案!
其他没有解决或者没看懂的类似问题:
"TypeError: 'function' object does not support item assignment" Python Array is read-only, can't append values http://www.pythonbackend.com/topic/1329787069?reply=3【问题讨论】:
在您说“以下代码的解决方案”的部分中,您列出了从 1 到 49 的列表,但声称它达到了 99。这可以解释为什么到 66 超出范围。 另外,list(xrange(1, 50))
是写range(1, 50)
的低效方式。
请问您为什么想要这样的行为?如果您预先分配列表,我希望您不想为分配范围之外的元素分配值。
@dpwilson 抱歉,它应该超出范围,我正在展示我试图解决的问题。我已经更新了评论。并且感谢其他代码缩短,我仍在学习,所以其中大部分是从不同地方复制和编辑。我已经记下了更快的方法,谢谢!
@Lisa 我希望最终结果是自动处理在服务器上实时更新的数据集。我希望,如果我可以将列表扩展到之前的范围之外,它将使我不必每次都重新导入所有数据 - 我可以只导入新数据并将其附加到末尾。考虑到它有 100Hz 的采样率,输入数据的列表长度总会有一些变化
【参考方案1】:
如果您要接近 Python 中类似 Matlab 的功能,您至少需要熟悉 numpy。以下是有用的参考: https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html
【讨论】:
【参考方案2】:我建议您尽量避免完全动态地增加列表的大小(在 MATLAB 和 python 中),除非您有充分的理由这样做。也许您可以在分配之前在代码的其他地方检查列表的所需(最终)大小。
所以我会采取与您的建议相同的方式,不同之处在于您可以像这样分配一个空列表:
arr = [None] * 100
for i in range(100):
arr[i] = i*2
或者,正如 John Greenall 所建议的,使用numpy
:
import numpy as np
arr = np.empty(100)
for i in range(100):
arr[i] = i*2
【讨论】:
谢谢!我希望创建一个自动处理数据的脚本,因此我将导入新数据(旧数据的最后几个文件可能已更改)以处理以前的数据。在不动态增加大小或追加的情况下,我的猜测是: # 将新导入减半 # 用更正的数据覆盖旧数据 # 预分配新列表的长度 # 然后用两个单独的列表填充它(旧的+更正的数据和新数据)/动态更新列表将允许我从第一个新文件开始并在一个 for 循环中覆盖/附加所有未来数据。有没有更简单的方法?以上是关于Python相当于在Matlab中分配给一个数组(在for循环内)的主要内容,如果未能解决你的问题,请参考以下文章