我有一个问题,无论我给它多少次,我都找不到解决方案。我有一个程序,可以在其中生成一系列数据并将其存储在列表中。稍后我必须删除一些列表项以使它们的大小更小。我总是删除使用“del”或“pop”函数的列表的第一个或最后一个元素。
为了生成我想要处理的列表,我调用了一个我创建的函数并返回一个列表。像这样的东西:
y = generadatos(a1,a2,a3)
del y[0]
当它到达带有“del”的行时,程序挂起。我试图通过键入 del y[0] 从控制台执行此操作,它给了我以下错误:
ValueError:无法删除数组元素
但是,如果我打开一个新工作表并创建这个简单的代码,它就可以正常工作:
a=[1,2,3,4]
del a[0]
print a
如果我不使用“del”而使用“pop”,也会发生同样的事情。我认为生成数据的函数返回给我的列表可能做了一些我不理解的事情,这就是为什么它不允许我删除元素的原因。
有任何想法吗?
非常感谢。
编辑1:
“生成”函数是这样的:
def generadatos(nst,p0st,ast,lbst,timesstrst,pvst,incremst):
xbigst = 0
xsmallst = 0
I0bigst = []
I0smallst = []
for ist in range(0,nst+1):
pst = p0st + ast*ist
pbigst = np.abs((pst*pvst)/(pst-pvst))
psmallst = np.abs((pst*pvst)/(pst+pvst))
limitpbigst = pbigst/lbst
limitpbigst = np.int(limitpbigst)
halflimitpbigst = np.int(limitpbigst/2)
limitpsmallst = psmallst/lbst
limitpsmallst = np.int(limitpsmallst)
halflimitpsmallst = np.int(limitpsmallst/2)
for jst in range(0,timesstrst):
for kst in range(0,halflimitpbigst):
I0bigst.append(1)
xbigst = xbigst + 1
for lst in range(halflimitpbigst,limitpbigst):
I0bigst.append(0)
xbigst = xbigst + 1
for mst in range(0,halflimitpsmallst):
I0smallst.append(1)
xsmallst = xsmallst + 1
for ost in range(halflimitpsmallst,limitpsmallst):
I0smallst.append(0)
xsmallst = xsmallst + 1
limitpbig2st = np.int((pbigst/2)/lbst)
for qst in range (0,limitpbig2st):
del I0bigst[-1]
limitpsmall2st = np.int((psmallst/2)/lbst)
for rst in range (0,limitpsmall2st):
del I0smallst[-1]
if incremst > 0:
aux1st = I0bigst[::]
I0bigst = aux1st[::-1]
else:
aux1st = I0smallst[::]
I0smallst = aux1st[::-1]
I0st = np.append(I0smallst,I0bigst)
return I0st`
起初我创建空列表,如I0 = []
. 然后我使用 `I0.append(value) 添加数据最后我使用 NumPy 函数 I0st = np.append(I0smallst,I0bigst)
return I0st
NumPy 数组不可调整大小,也不支持动态类型。之所以如此,是因为寻求效率,以最直接的方式使用下面的编译 C 代码。这意味着调整数组大小意味着是否或是否创建新数组。
del
这就是它不起作用的原因。有两种方法可以从 NumPy 数组中删除元素,都涉及创建数组的副本,并且返回的是这个副本(因为如前所述,不能就地完成):
- 使用方法
numpy.delete
接收三个参数:
数组作为第一个参数。
要删除的元素的索引(或可迭代的索引)作为第二个参数。
它充当第三方的轴。
- 在阵列上使用切片技术。这个选项通常更有效,特别是如果我们只从数组的开头或结尾删除:
如果您打算使用由 返回的元素
list.pop
,在这种情况下,您必须首先通过索引获取元素,然后使用两种方法之一应用删除。也可以将数组转换为列表或队列(如果末尾的添加和删除操作将占主导地位),请记住,切换到使用列表时可能会改变类型和效率损失或类似的(除了不能使用 NumPy 自己的方法):
如果你不关心使用 NumPy 数组,你应该让你的函数返回一个列表。如果
I0s
它只是连接两个列表的结果,正如您在代码中所指出的那样,那么这样做就足够了: