是否可以保存一个numpy数组,将其附加到已经存在的npy文件中np.save(filename,arr,mode='a')?
我有几个函数必须遍历大数组的行.由于内存限制,我无法立即创建数组.为了避免一遍又一遍地创建行,我想创建每一行一次并将其保存到文件中,并将其附加到文件中的上一行.稍后我可以在mmap_mode中加载npy文件,在需要时访问切片.
我想知道是否有一种等效方法可以使用MultiIndex向Series或DataFrame添加一行,因为只有一个索引,即使用.ix或.loc?
我认为自然的方式会是这样的
row_to_add = pd.MultiIndex.from_tuples()
df.ix[row_to_add] = my_row
Run Code Online (Sandbox Code Playgroud)
但这引发了一个KeyError.我知道我可以使用.append(),但我觉得使用.ix []或.loc []更加整洁.
这里有一个例子:
>>> df = pd.DataFrame({'Time': [dt.datetime(2013,2,3,9,0,1), dt.datetime(2013,2,3,9,0,1)], 'hsec': [1,25], 'vals': [45,46]})
>>> df
Time hsec vals
0 2013-02-03 09:00:01 1 45
1 2013-02-03 09:00:01 25 46
[2 rows x 3 columns]
>>> df.set_index(['Time','hsec'],inplace=True)
>>> ind = pd.MultiIndex.from_tuples([(dt.datetime(2013,2,3,9,0,2),0)],names=['Time','hsec'])
>>> df.ix[ind] = 5
Traceback (most recent call last):
File "<pyshell#201>", line 1, in <module>
df.ix[ind] = 5
File "C:\Program Files\Python27\lib\site-packages\pandas\core\indexing.py", line 96, in __setitem__
indexer = self._convert_to_indexer(key, is_setter=True)
File "C:\Program Files\Python27\lib\site-packages\pandas\core\indexing.py", …Run Code Online (Sandbox Code Playgroud) 当数据中存在NaN时,我找不到计算包含多于两个变量的观测值的数组的相关系数矩阵的函数.有一些函数可以为变量对执行此操作(或者只使用~is.nan()来掩盖数组).但是通过循环遍历大量变量来使用这些函数,计算每对变量的相关性可能非常耗时.
所以我自己尝试并很快意识到这样做的复杂性是协方差正确归一化的问题.我对你如何做的意见非常感兴趣.
这是代码:
def nancorr(X,nanfact=False):
X = X - np.nanmean(X,axis=1,keepdims = True)*np.ones((1,X.shape[1]))
if nanfact:
mask = np.isnan(X).astype(int)
fact = X.shape[1] - np.dot(mask,mask.T) - 1
X[np.isnan(X)] = 0
if nanfact:
cov = np.dot(X,X.T)/fact
else:
cov = np.dot(X,X.T)
d = np.diag(cov)
return cov/np.sqrt(np.multiply.outer(d,d))
Run Code Online (Sandbox Code Playgroud)
该函数假定每行都是变量.它基本上是来自numpy的corrcoeff()的调整代码.我相信有三种方法可以做到这一点:
(1)对于每对变量,只采用那些一个和另一个变量都不是NaN的观察结果.如果你想同时对多个对进行计算并且上面的代码中没有涉及,那么这可以说是最准确但也是最难编程的.然而,为什么抛弃每个变量的均值和方差的信息,只是因为另一个变量的相应条目是NaN?因此,另外两个选择.
(2)我们用nanmean贬低每个变量,每个变量的方差是它的纳方差.对于协方差,每个观察,其中一个或另一个变量是NaN,但不是两者,是对无协变的观察,因此设置为零.协方差的因子是1 /(观察的数量,其中两个变量都不是NaN - 1),用n表示.相关系数的分母中的两个方差都由它们相应的非NaN观测数减去1来计算,分别由n1和n2表示.这是通过在上面的函数中设置nanfact = True来实现的.
(3)人们可能希望协方差和方差具有与没有NaN的相关系数的情况相同的因子.在这里执行此操作的唯一有意义的方法(如果选项(1)不可行),则简单地忽略(1/n)/ sqrt(1/n1*n2).由于该数字小于1,估计的相关系数将比(2)中的(绝对值)更大,但将保持在-1,1之间.这是通过设置nanfact = False来实现的.
我对你对方法(2)和(3)的看法非常感兴趣,特别是,我非常希望在不使用循环的情况下看到(1)的解决方案.
我想在一个轴上绘制一个图中的几个箱形图.但是,我用于箱图的数据太大而无法立即读入内存.所以我使用pandas read_csv()以块的形式阅读它.我想做的是在每次迭代中产生一些箱图,并将迭代i中的新箱图添加到与迭代i-1的箱图相同的图中,而不是继续迭代i-1的数据.
我想强调一点,我不需要更新现有箱图的数据.这更像是每次迭代都得到一个新的数据列,我想在现有的boxplot旁边显示该列的boxplot.
例如:说我有
df = pd.DataFrame(np.random.rand(100,2))
Run Code Online (Sandbox Code Playgroud)
假设我只能一个接一个地读取列.如何将第二列的boxplot添加到第一列的现有boxplot中,以获得与ax.boxplot(df.values)相同的结果?
我想从某个向量中获取一个矩阵x=(x_1,x_2, ..., x_I),其中该矩阵中的每一行 i 对应于x(i) := (x_1,...,x_{i-1},x_{i+1},...,x_I)。
我知道
from sklearn.cross_validation import LeaveOneOut
I = 30
myrowiterator = LeaveOneOut(I)
for eachrow, _ in myrowiterator:
print(eachrow) # prints [1,2,...,29]
# [0,2,...,29] and so on ...
Run Code Online (Sandbox Code Playgroud)
提供一个例程来获取上述矩阵的每一行。但我宁愿直接一步获得矩阵,直接对该矩阵进行操作,而不是循环遍历它的行。这会节省我一些计算时间。
python ×5
numpy ×3
correlation ×1
indexing ×1
matplotlib ×1
pandas ×1
save ×1
scikit-learn ×1
scipy ×1