编写接受数组的函数...'int'对象没有'__getitem__'属性
我刚开始学习Python,写了一个函数,代码如下:
import numpy as np
def crossover(v1,v2):
N=2
v1n=np.zeros(shape=(1,N+1))
v2n=np.zeros(shape=(1,N+1))
beta=np.random.rand(1)
v1n[0,0]=(1-beta)*v1[0]+beta*v2[0]
v1n[0][1]=v1[1]
v2n[0][0]=(1-beta)*v2[0]+beta*v1[0]
v2n[0][1]=v2[1]
return (v1n,v2n)
当我想查看crossover([3,4],[7,8])的结果时,出现了以下错误....:
Traceback (most recent call last):
File "<pyshell#82>", line 1, in <module>
crossover([4,5],[5,4])
File "C:\Python27\crossover.py", line 11, in crossover
v1n[0,0]=(1-beta)*v1[0]+beta*v2[0]
TypeError: 'int' object has no attribute '__getitem__'
1 个回答
0
你的代码在我的电脑上运行得很好,版本是Python 2.7.8。不过我觉得你的输出结果不太好。
如果你运行你的代码,你会得到这样的输出:
(array([[ 4.91965332, 5. , 0. ]]), array([[ 4.08034668, 4. , 0. ]]))
其实这输出是一个包含两个数组的元组,每个数组里都有一个列表。你在用numpy处理小的“数组”,但实际上这比普通的列表还要慢。numpy主要是用来处理成百上千的数据。
我建议你直接使用列表就好了。
让我给你举个例子,看看如果不用numpy我会怎么做 :D
import random
v1=[5,4]
v2=[4,5]
# basicly random number from 0 to 1
beta=random.random()
# let's initialize v1n and v2n (:
v1n = [0,0,0]
v2n = [0,0,0]
v1n[0] = (1-beta)*v1[0]+beta*v2[0]
v1n[1] = v1[1]
v2n[0] = (1-beta)*v2[0]+beta*v1[0]
v2n[1]=v2[1]
print("first 3d array:")
print(v1n)
print("second 3d array:")
print(v2n)
print("note that this really is 2d arrays because the 3rd dimension is always zero")