2017-05-06 100 views
-1

我使用python-3.x和我試圖運行這個鱈魚,但我收到此錯誤:ValueError異常:設置一個數組元素與以序列中的python-3.x的

Z = np.fromiter(map(schwefel, zip(X.flat,Y.flat)), dtype=np.float16, 
count=X.shape[0]*X.shape[1]).reshape(X.shape) 

ValueError: setting an array element with a sequence. 

謝謝問題是所有回合浮動dtype我無法解決它,請任何建議或意見將不勝感激。

import random 
from math import sin, cos, pi, exp, e, sqrt 
from operator import mul 
from functools import reduce 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 

try: 
    import numpy as np 
except: 
    exit() 

def schwefel(individual): 
    N = len(individual) 

    return 418.9828872724339*N-sum(x*sin(sqrt(abs(x))) for x in individual), 

fig = plt.figure() 
# ax = Axes3D(fig, azim = -29, elev = 50) 
ax = Axes3D(fig) 
X = np.arange(-500, 500, 10) 
Y = np.arange(-500, 500, 10) 
X, Y = np.meshgrid(X, Y) 

Z = np.fromiter(map(schwefel, zip(X.flat,Y.flat)), dtype=np.float16, count=X.shape[0]*X.shape[1]).reshape(X.shape) 

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, linewidth=0.2) 

plt.xlabel("x") 
plt.ylabel("y") 
plt.show() 
+0

在Py3中,'map'是一種生成器,需要將其包裝在'list(map ...)'列表中以獲取列表。 – hpaulj

+0

你爲什麼不用'numpy'函數執行'schwefel'計算? ('np.sin','np.abs'等) – hpaulj

+0

你的意思是在代碼中加入list:'code(Z = np.fromiter(list(map(schwefel,zip(X.flat,Y.flat) )))'@hpaulj if yes does not work !! – azeez

回答

0
something = map(schwefel, zip(X.flat,Y.flat)) 
print(type(something)) 
something = list(something) 
print(type(something), len(something)) 
print(something[:4]) 
Z = np.array(something) 
print(Z.dtype, Z.shape) 

產生

1010:~/mypy$ python3 stack43822778.py 
<class 'map'> 
<class 'list'> 10000 
[(476.78745748208433,), (586.67470048215569,), (696.81033496376426,), (801.49930810497494,)] 
float64 (10000, 1) 

地圖產生元組的列表。 np.array可以處理。 np.fromiter不能。

def foo(X,Y): 
    N = 2 
    temp = X * np.sin(np.sqrt(np.abs(X))) + Y * np.sin(np.sqrt(np.abs(Y))) 
    return 418.9828872724339*N - temp 

,並添加

Z1 = foo(X,Y) 
print(Z1.dtype, Z1.shape) 
print(np.allclose(Z1, Z.reshape(100,100))) # true 

foo評估爲XY所有值的功能,無需任何迭代。


如果我只是省略後面的逗號,該fromiter方法適用

return 418.9828872724339*N-sum(x*sin(sqrt(abs(x))) for x in individual) # , 

Z = np.fromiter(something, dtype=np.float16, count=X.shape[0]*X.shape[1]).reshape(X.shape) 
print(Z.shape, Z.dtype) 

something[:4]打印爲:

[476.78745748208433, 586.67470048215569, 696.81033496376426, 801.49930810497494] 

隨着後面的逗號,schwefel返回1元的元組,不一個標量。


測試使用的np.fromiter

製作的花車10000的列表,並與np.fromiter

In [55]: arr = np.random.rand(100,100) 
In [56]: alist = arr.ravel().tolist() 
In [57]: len(alist) 
Out[57]: 10000 
In [58]: timeit np.fromiter(alist, dtype=np.float16, count=10000) 
1000 loops, best of 3: 550 µs per loop 
In [59]: timeit np.array(alist, np.float16) 
1000 loops, best of 3: 506 µs per loop 
In [60]: timeit np.array(alist) 
1000 loops, best of 3: 412 µs per loop 
In [61]: timeit np.array(alist, np.float64) 
1000 loops, best of 3: 413 µs per loop 

基本上同時比較np.array

相關問題