假设我们有一个填充了一些int值的1d numpy数组.让我们说其中一些是0.
有没有办法,使用numpy数组的功能,0用找到的最后一个非零值填充所有值?
例如:
arr = np.array([1, 0, 0, 2, 0, 4, 6, 8, 0, 0, 0, 0, 2])
fill_zeros_with_last(arr)
print arr
[1 1 1 2 2 4 6 8 8 8 8 8 2]
Run Code Online (Sandbox Code Playgroud)
一种方法是使用此功能:
def fill_zeros_with_last(arr):
last_val = None # I don't really care about the initial value
for i in range(arr.size):
if arr[i]:
last_val = arr[i]
elif last_val is not None:
arr[i] = last_val
Run Code Online (Sandbox Code Playgroud)
但是,这是使用原始python for循环而不是利用numpy和 …
pandas.DataFrame.interpolate允许通过插入相邻值来填充缺失数据。在它接受的论点中,其中两个似乎与这个问题相关:method和limit。
method:除其他可能的值外,接受"linear"和"time"。它们之间的区别在于"linear"假设等距行并忽略索引,而"time"插值则考虑索引定义的时间间隔>>> df = pd.DataFrame({'vals': [11, np.nan, np.nan, 12, np.nan, 22]},\n... index=pd.to_datetime(['2020-02-02 11:00', '2020-02-02 11:06', '2020-02-02 11:30',\n... '2020-02-02 12:00', '2020-02-02 16:00', '2020-02-02 22:00']))\n>>> df.assign(interp_linear=df.interpolate(method='linear'),\n... interp_time=df.interpolate(method='time'))\n\n\xef\xbb\xbf vals interp_linear interp_time\n2020-02-02 11:00:00 11.0 11.000000 11.0\n2020-02-02 11:06:00 NaN 11.333333 11.1\n2020-02-02 11:30:00 NaN 11.666667 11.5\n2020-02-02 12:00:00 12.0 12.000000 12.0\n2020-02-02 16:00:00 NaN 17.000000 16.0\n2020-02-02 22:00:00 22.0 22.000000 22.0\nRun Code Online (Sandbox Code Playgroud)\nlimit:允许您根据缺失值的数量限制要使用插值填充的间隙的长度。它需要整数值,并定义为要填充的连续 NaN 的最大数量。虽然这种行为对于本案来说是绝对合理的method="linear",但对于本案来说似乎是有限的 …pairplot来自seaborn 的函数允许在数据集中绘制成对关系.
根据文档(突出显示添加):
默认情况下,此函数将创建一个Axes网格,以便数据中的每个变量将在y轴上跨单个行共享,并在x轴上跨单个列共享.对角轴的处理方式不同,绘制一个图表以显示该列中变量的数据的单变量分布.
还可以显示变量的子集或在行和列上绘制不同的变量.
我只能找到一个为行和列分组不同变量的例子,这里(它是与PairGrid和pairplot()部分的Plotting成对关系下的第6个图).正如您所看到的,它正在针对相同的单个因变量(y_vars)绘制许多自变量(x_vars),结果非常好.
我正在尝试对许多依赖变量绘制一个单独的自变量.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
ages = np.random.gamma(6,3, size=50)
data = pd.DataFrame({"age": ages,
"weight": 80*ages**2/(ages**2+10**2)*np.random.normal(1,0.2,size=ages.shape),
"height": 1.80*ages**5/(ages**5+12**5)*np.random.normal(1,0.2,size=ages.shape),
"happiness": (1-ages*0.01*np.random.normal(1,0.3,size=ages.shape))})
pp = sns.pairplot(data=data,
x_vars=['age'],
y_vars=['weight', 'height', 'happiness'])
Run Code Online (Sandbox Code Playgroud)
问题是子图被垂直排列,我找不到改变它的方法.
我知道那时平铺结构不会那么整洁,因为Y轴应该在每个子图上标记.另外,我知道我可以用这样的东西手工制作这些图:
fig, axes = plt.subplots(ncols=3)
for i, yvar in enumerate(['weight', 'height', 'happiness']):
axes[i].scatter(data['age'],data[yvar])
Run Code Online (Sandbox Code Playgroud)
不过,我正在学习使用seaborn,我觉得界面非常方便,所以我想知道是否有办法.此外,这个例子非常简单,但对于更复杂的数据集,seaborn会为你提供更多的东西,这会使raw-matplotlib方法变得更加复杂得多(色调,开始)
我正在尝试使用ccallJulia函数来使用C语言编写的代码.我知道如何将数组作为参数传递给期望的函数int *arg.例如,尝试使用此C函数
void sum_one(int *arr, int len)
{
for (int i=0; i<len; i++){
arr[i]++;
}
}
Run Code Online (Sandbox Code Playgroud)
这个Julia代码有效
x = collect(Cint, 1:5)
ccall((:sum_one, "/path/to/mylib.so"), Void, (Ptr{Cint}, Cint), x, 5)
Run Code Online (Sandbox Code Playgroud)
C函数似乎没那么直接,期望指向指针(int **arg)的指针被用作二维矩阵.说这个
void fill_matrix(int **arr, int row, int col)
{
for (int i=0; i<row; i++){
for (int j=0; j<col; j++){
arr[i][j] = arr[i][j] + i + j*10;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我需要创建一个数组数组,以便C代码接受它:
xx = [zeros(Cint, 5) for i in 1:6]
ccall((:fill_matrix, "/path/to/mylib.so"),
Void, …Run Code Online (Sandbox Code Playgroud) 该pip install命令默认安装 python 包的最新稳定版本(由PEP426指定的稳定版本)
--pre该命令的标志pip install告诉 pip 还考虑发布候选版本和 python 包的开发版本。但据我了解,pip install --pre packageA它将安装 的开发版本packageA,以及所有依赖项的开发版本。
是否可以使用 pip 安装包的开发版本,但安装其所有依赖项的稳定版本?
我尝试过的一件事是安装软件包的稳定版本(具有稳定的依赖项),然后重新安装不带依赖项的开发版本:
pip install packageA
pip install --pre --no-deps --upgrade --force-reinstall packageA
但问题是,如果开发版本packageA添加了新的依赖项,则不会安装。
我缺少什么吗?谢谢!
假设我有一个具有有限数量唯一值的数组。说
data = array([30, 20, 30, 10, 20, 10, 20, 10, 30, 20, 20, 30, 30, 10, 30])
Run Code Online (Sandbox Code Playgroud)
而且我还有一个参考数组,其中包含在 中找到的所有唯一值data,没有重复且按特定顺序排列。说
reference = array([20, 10, 30])
Run Code Online (Sandbox Code Playgroud)
而且我想创建一个形状相同的数组,而不是data包含reference数组中的索引作为值,其中data找到数组中的每个元素。
换句话说,有data和reference,我想创建一个数组indexes,使得以下内容成立。
data = reference[indexes]
Run Code Online (Sandbox Code Playgroud)
一个次优的计算indexes方法是使用 for 循环,像这样
indexes = np.zeros_like(data, dtype=int)
for i in range(data.size):
indexes[i] = np.where(data[i] == reference)[0]
Run Code Online (Sandbox Code Playgroud)
但我很惊讶没有numpythonic(因此更快!)方法来做到这一点......有什么想法吗?
谢谢!
FacetGridfrom seaborn创建一个子网格,允许您探索数据集中的条件关系.
函数接受的两个关键字参数是sharex和sharey,根据文档:
分享{x,y}:bool,可选
如果为true,则facet将跨行跨越列和/或x轴共享y轴.
但我没有看到任何其他方法来控制facets/subplots共享轴的方式.所以这里......
有没有办法跨行和/或y轴跨行共享x轴?
我正在尝试获得不同条件(列和色调)的不同数量(行数)的密度图.因此,我希望我的子图可以跨行共享x轴和y轴,但不会跨列链接.
python ×6
numpy ×2
seaborn ×2
arrays ×1
c ×1
julia ×1
matplotlib ×1
pandas ×1
performance ×1
pip ×1