簡體   English   中英

不同大小的 numpy arrays 的元素明智平均值

[英]Element wise mean of numpy arrays of different sizes

因此,我正在閱讀一個 csv 文件,其中我關注的是 col3,其中行具有不同長度的值,最初它被讀取為 str 類型,但使用 pd.eval 進行了修復。

df = pd.read_csv('datafile.csv', converters={'col3': pd.eval})


row e.g. [0, 100, -200, 300, -150...]

有許多不同大小的行,我想計算元素明智的平均值,我已經遵循了這個解決方案 我首先遇到了 Numpy VisibleDeprecationWarning 錯誤,我使用它修復了錯誤。 但是對於使用 np.nanmean 的解決方案的最后一步,我遇到了一個新錯誤,即

ValueError:具有多個元素的數組的真值不明確。 使用 a.any() 或 a.all()

到目前為止,我的代碼看起來像這樣:

import pandas as pd
import numpy as np
import itertools 

df = pd.read_csv('datafile.csv', converters={'col3': pd.eval})

datafile = df[(df['col1'] == 'Red') & (df['col2'] == Name) & ((df['col4'] == 'EX') | (df['col5'] == 'EX'))]
   
np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning) 
ar = np.array(list(itertools.zip_longest(df['col3'], fillvalue=np.nan)))
print(ar)
np.nanmean(ar,axis=1)

arrays 像這樣打印在此處輸入圖像描述

錯誤指向最后一行在此處輸入圖像描述

如果指向 arrays 類型為 object,我可以看到該錯誤,但我不確定如何修復它。

制作一個參差不齊的數組:

In [23]: arr = np.array([np.arange(5), np.ones(5),np.zeros(3)],object)
In [24]: arr
Out[24]: 
array([array([0, 1, 2, 3, 4]), array([1., 1., 1., 1., 1.]),
       array([0., 0., 0.])], dtype=object)

注意形狀和數據類型。

嘗試對它使用 mean :

In [25]: np.mean(arr)
Traceback (most recent call last):
  Input In [25] in <cell line: 1>
    np.mean(arr)
  File <__array_function__ internals>:180 in mean
  File /usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py:3432 in mean
    return _methods._mean(a, axis=axis, dtype=dtype,
  File /usr/local/lib/python3.10/dist-packages/numpy/core/_methods.py:180 in _mean
    ret = umr_sum(arr, axis, dtype, out, keepdims, where=where)
ValueError: operands could not be broadcast together with shapes (5,) (3,) 

將均值應用於每個元素數組有效:

In [26]: [np.mean(a) for a in arr]
Out[26]: [2.0, 1.0, 0.0]

嘗試使用 zip_longest:

In [27]: import itertools
In [28]: list(itertools.zip_longest(arr))
Out[28]: 
[(array([0, 1, 2, 3, 4]),),
 (array([1., 1., 1., 1., 1.]),),
 (array([0., 0., 0.]),)]

沒變。 我們可以通過解壓 arr 來使用它——但它以錯誤的方式填充了 arrays:

In [29]: list(itertools.zip_longest(*arr))
Out[29]: [(0, 1.0, 0.0), (1, 1.0, 0.0), (2, 1.0, 0.0), (3, 1.0, None), (4, 1.0, None)]

zip_longest可用於填充列表,但比這需要更多考慮。

如果我們從該列表中創建一個數組:

In [35]: np.array(list(itertools.zip_longest(*arr,fillvalue=np.nan)))
Out[35]: 
array([[ 0.,  1.,  0.],
       [ 1.,  1.,  0.],
       [ 2.,  1.,  0.],
       [ 3.,  1., nan],
       [ 4.,  1., nan]])

並轉置它,我們可以采用nanmean

In [39]: np.array(list(itertools.zip_longest(*arr,fillvalue=np.nan))).T
Out[39]: 
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 0.,  0.,  0., nan, nan]])
In [40]: np.nanmean(_, axis=1)
Out[40]: array([2., 1., 0.])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM