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循环内)的主要内容,如果未能解决你的问题,请参考以下文章

为啥在三元函数中分配给数组类型的表达式失败

从新分配的内存中分配给对象

如何从数组中获取值并在zend框架工作中分配给视图

定义在PHP中分配给变量的类的值。

无法在具有 MagicalRecord [核心数据] 的实体中分配给 ...

同一类的一个对象如何在 c++ 中分配给同一类的另一个对象? [关闭]