Python - 不支持的操作数类型+:' numpy.ndarray'和' str'

时间:2015-01-21 18:58:11

标签: python numpy

长时间读者还是第一次发布海报。我试图编写一个简单的用户输入正弦图形抽屉,它会影响图形的频率,幅度和相移。我们的目标是将所有内容都用于pi,以便将数学和物理学生介绍给弧度。

我的问题是,我在标题中收到错误,同时试图检测单词' pi'在用户输入中并将其转换为np.pi以用作浮点数。该程序的代码(除此pi部分以外的工作)发布在下面:

import sys
import matplotlib.pyplot as plt
import numpy as np

a = float(input("Amplitude of the curve: "))
f = float(input("Frequency of the curve: "))
p = input("Phase shift of the curve: ")

if "pi" in p:
str.translate(np.pi, "pi")
float(p)

else: float(p)

x = np.linspace(0, 2*np.pi, 1000)
y = a*np.sin((f*x)+p)

plt.grid()

plt.xlabel('x = angle(rads)', fontsize=18)
plt.ylabel('y = amplitude', fontsize=18)
plt.title('The Sine Function', fontsize=26)

plt.xticks(np.linspace(0,2*np.pi,5), ['0', '$\pi$/2', '$\pi$', '3$\pi$/2', '2$\pi$'])
plt.yticks(np.arange(min(y), max(y)+1, max(y)), [round(min(y)), '0', round(max(y))])

plt.plot(x, y)
plt.show()

savefile = input("Do you wish to save the file? ")

if "no" in savefile:
sys.exit()

elif "yes" in savefile:
plt.grid()
plt.xticks(np.linspace(0,2*np.pi,5), ['0', '$\pi$/2', '$\pi$', '3$\pi$/2', '2$\pi$'])
plt.yticks(np.arange(min(y), max(y)+1, max(y)), [round(min(y)), '0', round(max(y))])
plt.plot(x, y)
filename = input("Name the file: ")
plt.savefig(filename, format='pdf', bbox_inches='tight',     pad_inches=0.3)

else: print("\n","Invalid input. Ending Script" ,sep="", end="\n \n")
sys.exit()

提前致谢

2 个答案:

答案 0 :(得分:1)

您的错误是由于以下行:

y = a*np.sin((f*x)+p)

因为你没有将p转换成浮点数。在以下命令中(你还有一个坏的缩进,你需要纠正它):

if "pi" in p:
    str.translate(np.pi, "pi")
    float(p)

float功能不是和就地功能,您需要再次将其分配给p

if "pi" in p:
    str.translate(np.pi, "pi")
    p=float(p)

答案 1 :(得分:1)

首先,正如@Kasra所说,打电话

float(p)

不修改对象p。相反,它返回一个新的float对象。因此,您需要保存对其返回内容的引用,例如:

p = float(p)

但是,str.translate(np.pi, "pi")并没有按照您的想法行事。事实上,当你调用它时,你应该收到一个错误。 translate是一种字符串对象的方法,用于将特定字符替换为其他特定字符。您不能使用它来将子字符串"pi"替换为浮点对象np.pi,因为字符串不能包含浮点数。

你想要的可能更像是:

if 'pi' in p:
    p = p.replace('pi', '')
    p = np.pi * float(p)
else:
    p = float(p)

此外,您可以通过挂在图形对象上并保存它而不是创建新图形来简化matplotlib部分。

例如(我正在运行python 2.x,所以我做了一些小的改动。唯一的区别是raw_input vs inputfrom __future__ import print_function 。):

from __future__ import print_function
import matplotlib.pyplot as plt
import numpy as np

a = float(raw_input("Amplitude of the curve: "))
f = float(raw_input("Frequency of the curve: "))
p = raw_input("Phase shift of the curve: ")

if "pi" in p:
    p = np.pi * float(p.replace('pi', ''))
else:
    p = float(p)

x = np.linspace(0, 2*np.pi, 1000)
y = a*np.sin((f*x)+p)

fig, ax = plt.subplots()
ax.grid()
ax.set_xlabel('x = angle(rads)', fontsize=18)
ax.set_ylabel('y = amplitude', fontsize=18)
ax.set_title('The Sine Function', fontsize=26)

ax.set(xticks=np.linspace(0,2*np.pi,5),
       xticklabels=['0', '$\pi$/2', '$\pi$', '3$\pi$/2', '2$\pi$'],
       yticks=np.arange(min(y), max(y)+1, max(y)),
       yticklabels=[round(min(y)), '0', round(max(y))])

ax.plot(x, y)
plt.show()

savefile = raw_input("Do you wish to save the file? ")
if "no" in savefile:
    pass
elif "yes" in savefile:
    fig.savefig('filename.pdf', bbox_inches='tight', pad_inches=0.3)
else:
    print("\nInvalid input. Ending Script\n\n")