【问题标题】:ValueError: Cannot copy sequence to array axis in Python for MatplotLib AnimationValueError:无法在 Python 中将序列复制到 MatplotLib 动画中的数组轴
【发布时间】:2018-01-02 10:07:06
【问题描述】:

我正在读取一个不断更新的data.txt 文件,并正在计算传入数据流的滚动标准偏差。我将其存储在std 中。我的滚动标准差的窗口大小为 100。

我收到一个错误:

ValueError: cannot copy sequence with size 78 to array axis with dimension 1

其中大小对应于std 数组中的项目数。 (当然,每次我点击 Run 时,这个值都会增加)。

我想知道为什么我会收到此 ValueError,并且正在寻找任何修复它的建议!当我只是为ax1.plot(xar, yar) 评分时,动画效果很好。但是一旦我尝试绘制ax1.plot(xar, std),问题就出现了。

data.txt 中的数据如下:

[0.0, 0.0078125, 0.015625][0.0, 0.0078125, 0.015625][0.0, 0.0078125, 0.015625][0.0, 0.0078125, 0.015625][0.0, 0.0078125, 0.015625][0.0, 0.0078125, 0.015625][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0244140625, 0.0322265625, 0.9609375][0.0263671875, 0.0341796875, 1.0341796875][0.0263671875, 0.0341796875, 1.0341796875][0.0263671875, 0.0341796875, 1.0341796875][0.0263671875, 0.0341796875, 1.0341796875][0.0263671875, 0.0341796875, 1.0341796875][0.0263671875, 0.0341796875, 1.0341796875][0.0263671875, 0.0341796875, 1.0341796875][0.0263671875, 0.0341796875, 1.0341796875][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.0244140625, 0.0341796875, 1.0048828125][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.033203125, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.0263671875, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.0107421875][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625][0.025390625, 0.0341796875, 1.009765625]

我目前的代码如下:

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

def animate(i):
    data = pd.read_csv("C:\\Users\\Desktop\\data.txt", sep="\[|\]\[|\]",engine = 'python', header = None)
    data = data.iloc[0]
    data = data.astype(str).apply(lambda x: x.split(',')[-1]).astype(float)
    data.pop(0)
    xar = []
    yar = []
    std = []
    for j in range(len(data)):
        xar.append(j)
    for k in range(len(data)):
        yar.append(data.iloc[k])
    yar = pd.DataFrame(yar)
    std.append(pd.rolling_std(yar, 100))
    ax1.clear()
    ax1.plot(xar,std)
ani = animation.FuncAnimation(fig, animate, interval=.01)
plt.show()

【问题讨论】:

    标签: python valueerror


    【解决方案1】:

    您的错误原因是您std成为数据框的(一个元素的)列表。 pd.rolling_std() 已经为您提供了一个数据框,然后您将其附加到您的列表中。如果直接赋值,效果会更好:

    std = pd.rolling_std(yar, 100)
    

    但是,当运行pd.rolling_std() 时,会给出弃用警告。因此,该行应该是:

    std = yar.rolling(window=100,center=False).std()
    

    此外,对于生成xaryar 的方式,还可以进行一些简化。 xar 只是一个范围,yar 包含 data 的所有元素,允许您编写:

    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    def animate(i):
        data = pd.read_csv("C:\\Users\\Desktop\\data.txt", sep="\[|\]\[|\]",engine = 'python', header = None)
        data = data.iloc[0]
        data = data.astype(str).apply(lambda x: x.split(',')[-1]).astype(float)
        data.pop(0)
        xar = range(len(data))
        yar = pd.DataFrame(data)
        std = yar.rolling(window=100,center=False).std()
        ax1.clear()
        ax1.plot(xar,std)
    
    fig = plt.figure()
    ax1 = fig.add_subplot(1,1,1)
    ani = animation.FuncAnimation(fig, animate, interval=.01)
    plt.show()
    

    其中animate() 已有所简化。

    【讨论】:

    • 太棒了!这非常有效。感谢您的支持!像你这样的人让这个社区变得如此棒。
    • 在动画的最开始,有一个大的尖峰。我怎样才能消除动画中的这个初始尖峰?
    • 我不知道您的确切用例,所以我不知道。但是,当使用滚动平均值时,在你有足够多的数据点来获得你的第一个平均值(上面代码中的 100)之前,你一开始有一堆 nan (不是数字)值。因此,当您遇到 100 个元素时,可能会出现颠簸,您将从 nan 值变为实际值。你看到的会是这个吗?
    • 这意味着没有什么可做的,因为它是数据本身的属性。可以在初始平均值中使用更少的值,从 1 增加到 100,但我不知道这是否更好。而且它需要更多的逻辑。
    • 也许你可以在这里提出一个后续问题来支持我:stackoverflow.com/questions/45358721/…
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2016-01-02
    • 2013-09-12
    • 2020-10-15
    • 2016-09-20
    • 2021-07-24
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多