-2

我正在使用 python-3.x,并且正在尝试运行此 cod,但收到此错误:

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()
4

1 回答 1

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.arraynp.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

基本上是同一时间。

于 2017-05-06T18:43:08.707 回答