Python numpy - 列出超出范围的赋值索引



>我有一个以下格式的CSV文件

86,1
15,2
19,3
52,4
15,5
13,6
18,7
20,8
49,9
266,10

为了重现性,我在此处包含完整的CSV文件。从第 1 列开始,我想读取当前行并将其与上一行的值进行比较。如果它更大,我想取当前值与前一个值的差值,并将差值存储(append)在一个列表中。如果当前值等于上一行的值,请继续比较。让我说清楚。例如,在上面我提供的示例记录中,第三行(19)大于第二行(15)中的值 - 因此它将是(19-15 =4),第四行(52-19 = 33)等。

这是我使用numpy的简单方法

import numpy as np
import pandas as pd
import csv
df = pd.read_csv("testdata.csv")
with open("testdata.csv") as f:
    reader = csv.reader(f, delimiter=",")
    for i in reader:
        print (i[0])
        diffs=np.diff(i[0])
        increased_value=np.median(diffs[diffs>0])

但是,我收到错误IndexError: list assignment index out of range.如何修复此错误以解决我提到的任务?

我认为这是一个更好的方法

df = pd.read_csv("testdata.csv", header=None)
df
     0     1
0   86     1
1   15     2
2   19     3
3   52     4
4   15     5
5   13     6
6   18     7
7   20     8
8   49     9
9   266   10
diffs = np.diff(df[0])
increased_value = np.median(diffs[diffs>0])
increased_value
17.0

使用 pandas s.diff()

data = StringIO("""86,1
15,2
19,3
52,4
15,5
13,6
18,7
20,8
49,9
266,10""")
df=pd.read_csv(data,header=None)
m1=df[0].diff().fillna(0)
#m1[m1>0].tolist()
#[4.0, 33.0, 5.0, 2.0, 29.0, 217.0]
m1[m1>0].median()
#17.0

基本上,np.diff()期望一个像输入这样的列表,而你传递的是一个整数。这就是它失败的原因

我们在技术上不需要numpy

from statistics import median
from operator import itemgetter, lt, sub
first = itemgetter(0)
nums = []
with open('testdata.csv', 'r') as fin:
    reader = csv.reader(fin)
    for line in reader:
        nums.append(int(first(line)))
res = [abs(sub(*t)) for t in zip(nums, nums[1:]) if lt(*t)]
[4, 33, 5, 2, 29, 217]
median(res)
17.0

你得到的原因

索引

错误:列表分配索引超出范围

是 np.diff() 接受数组或列表等输入。

喜欢

arr = []
df = pd.read_csv("testdata3.csv")
df
with open("testdata3.csv", mode='r', encoding='utf-8-sig') as f:
    reader = csv.reader(f, delimiter=",")
    for i in reader:
#         print(i[0])
        arr.append(int(i[0]))
diffs=abs(np.diff(arr))
increased_value=np.median(diffs[diffs>0])

您遇到的问题是,当您尝试运行 np.diff 时,数组的默认 dtype 是 dtype U3,这意味着数组中的值不是数字,这意味着需要进行转换。请尝试以下操作:

with open("test_data.csv", "r") as f:
    reader = csv.reader(f) ## no need for delimiter if your delimiter is ','
    data = []
    for row in reader:
        data.append(row[0])
## ensure that you convert your data into numpy array with appropriate data type 
## before carrying out any mathematical operations 
np_array = np.array(data, dtype=np.uint8) 
np_diff = np.diff(np_array)
np_median = abs(np.median(np_diff[np_diff > 0]))
print(np_median)

如果你必须定期这样做,那么你总是可以把这个回合包装成一个方法。试一试。

最新更新