编写接受数组的函数...'int'对象没有'__getitem__'属性

-1 投票
1 回答
889 浏览
提问于 2025-04-28 09:10

我刚开始学习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速度的信息

我建议你直接使用列表就好了。

让我给你举个例子,看看如果不用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")

撰写回答