TypeError:在绘图时,只有length-1数组可以转换为Python标量

时间:2016-04-17 18:21:43

标签: python numpy

我有这样的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

我该如何解决?

5 个答案:

答案 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)

使用:

x.astype(int)

这是reference

答案 2 :(得分:2)

dataframe['column'].squeeze() 应该可以解决这个问题。它基本上将数据框列更改为列表。

答案 3 :(得分:1)

记下为x打印的内容。您正在尝试将数组(基本上只是一个列表)转换为int。 length-1将是一个单个数字的数组,我认为numpy只是将其视为一个浮点数。你可以做到这一点,但它不是一个纯粹的numpy解决方案。

编辑:几个星期前我参与了一个帖子,其中numpy比我预期的要慢一些,我意识到我已经陷入了一种默认的心态,即numpy一直是速度的方式。由于我的答案不像ayhan那样干净,我想我会用这个空间来表明这是另一个这样的例子来说明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])