我有这样的Python代码:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.int(x)
x = np.arange(1, 15.1, 0.1)
plt.plot(x, f(x))
plt.show()
这样的错误:
TypeError: only length-1 arrays can be converted to Python scalars
我该如何解决?
答案 0 :(得分:19)
当函数需要单个值但是传递数组时,会引发错误“只有长度为1的数组可以转换为Python标量”。
如果查看np.int
的呼叫签名,您会看到它接受单个值,而不是数组。通常,如果要将接受单个元素的函数应用于数组中的每个元素,可以使用np.vectorize
:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.int(x)
f2 = np.vectorize(f)
x = np.arange(1, 15.1, 0.1)
plt.plot(x, f2(x))
plt.show()
你可以跳过f(x)的定义,只需将np.int传递给vectorize函数:f2 = np.vectorize(np.int)
。
请注意np.vectorize
只是一个便利函数,基本上是for循环。这对大型阵列来说效率低下。只要有可能,请使用真正的矢量化函数或方法(例如astype(int)
作为@FFT suggests)。
答案 1 :(得分:8)
答案 2 :(得分:2)
dataframe['column'].squeeze()
应该可以解决这个问题。它基本上将数据框列更改为列表。
答案 3 :(得分:1)
记下为x
打印的内容。您正在尝试将数组(基本上只是一个列表)转换为int。 length-1
将是一个单个数字的数组,我认为numpy只是将其视为一个浮点数。你可以做到这一点,但它不是一个纯粹的numpy解决方案。
vectorize
比建立一个列表慢大约10%蟒蛇。我不太了解numpy来解释为什么会这样,但也许其他人呢?
import numpy as np
import matplotlib.pyplot as plt
import datetime
time_start = datetime.datetime.now()
# My original answer
def f(x):
rebuilt_to_plot = []
for num in x:
rebuilt_to_plot.append(np.int(num))
return rebuilt_to_plot
for t in range(10000):
x = np.arange(1, 15.1, 0.1)
plt.plot(x, f(x))
time_end = datetime.datetime.now()
# Answer by ayhan
def f_1(x):
return np.int(x)
for t in range(10000):
f2 = np.vectorize(f_1)
x = np.arange(1, 15.1, 0.1)
plt.plot(x, f2(x))
time_end_2 = datetime.datetime.now()
print time_end - time_start
print time_end_2 - time_end
答案 4 :(得分:0)
在这种情况下,输出必须是四舍五入的 int
值。
import numpy as np
arr = np.array([2.34, 2.56, 3.12])
output = np.round(arr).astype(int)
print(output)
# array([2, 3, 3])