【问题标题】:ValueError: setting an array element with a sequence- python-3.xValueError:使用序列设置数组元素-python-3.x
【发布时间】:2017-10-04 23:42:56
【问题描述】:

我正在使用 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.

我感谢问题是我无法解决的 float 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()

【问题讨论】:

  • 在 Py3 中,map 是一种生成器,需要将其包裹在 list(map...) 中以获取列表。
  • 您为什么不用numpy 函数执行schwefel 计算? (np.sinnp.abs 等)
  • 你的意思是在代码中添加列表:code(Z = np.fromiter (list(map(schwefel, zip(X.flat,Y.flat))))@hpaulj 如果是的话它不起作用!!
  • 不要让我们有悬念!提供有关错误和中间值的更多信息。您不会指望我将代码复制粘贴到我的计算机上并自己调试,对吗?
  • 我所做的是code Z = np.fromiter (list(map(schwefel, zip(X.flat,Y.flat)), dtype=np.float, count=X.shape[0]*X.shape[1])).reshape(X.shape),但我收到了这个错误code TypeError: list() takes at most 1 argument (3 given) !!! @hpaulj

标签: python-3.x numpy valueerror


【解决方案1】:
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

fooXY 的所有值计算函数,无需任何迭代。


如果我只是省略尾随逗号,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

基本上是同一时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2018-08-04
    • 2019-08-04
    相关资源
    最近更新 更多