我std::vector<std::vector<double>>正在尝试尽快将其转换为单个连续向量。我的向量的形状大致为4000 x 50。
问题是,有时我的输出向量需要以列为主的连续顺序(仅将2d输入向量的内部向量连接起来),有时我的输出向量需要以行为主的连续顺序,实际上需要转置。
我发现,朴素的for循环对于转换为以列为主的向量非常快:
auto to_dense_column_major_naive(std::vector<std::vector<double>> const & vec)
-> std::vector<double>
{
auto n_col = vec.size();
auto n_row = vec[0].size();
std::vector<double> out_vec(n_col * n_row);
for (size_t i = 0; i < n_col; ++i)
for (size_t j = 0; j < n_row; ++j)
out_vec[i * n_row + j] = vec[i][j];
return out_vec;
}
Run Code Online (Sandbox Code Playgroud)
但是显然,由于所有的高速缓存未命中,因此类似的方法对于逐行转换非常慢。因此,对于逐行转换,我认为提高缓存局部性的阻止策略可能是我最好的选择:
auto to_dense_row_major_blocking(std::vector<std::vector<double>> const & vec)
-> std::vector<double>
{
auto n_col = vec.size();
auto n_row = vec[0].size();
std::vector<double> out_vec(n_col * n_row);
size_t block_side …Run Code Online (Sandbox Code Playgroud) 我有一个像DataFrame
df = pd.DataFrame(np.random.randn(10).reshape(2, 5))
df
# 0 1 2 3 4
# 0 -0.067162 -0.505401 -0.019208 1.123936 0.087682
# 1 -0.373212 -0.598412 0.185211 0.736143 -0.469111
Run Code Online (Sandbox Code Playgroud)
我想输出这些数据帧为HTML,和以前使用to_html像
df.to_html(classes=['table', 'table-hover', 'table-bordered'],
float_format=lambda x: '{0:.3f}s'.format(x))
Run Code Online (Sandbox Code Playgroud)
但后来我遇到了Style功能,并认为在我的DataFrame中为浮动设备设置样式会很好.喜欢
def colorize(num)
color = 'red' if (np.isnan(num) or num > 0) else 'green'
return 'color: %s' % color
Run Code Online (Sandbox Code Playgroud)
我可以将其应用于我的DataFrame
df_styler = df.Style.applymap(colorize)
Run Code Online (Sandbox Code Playgroud)
但是现在df_styler是一个Styler对象,虽然它有一个render方法,但我看不出如何传递classes我正在使用的列表或浮动格式化程序to_html...
有没有办法可以使用Style函数和CSS类/格式化程序组合to_html?
我有一个~50GB的csv文件,我必须这样做
我选择使用Pandas,并且有一种通用的方法来迭代一个方便的块大小(超过五十万行)的块来生成一个DataFrame,并将块附加到每个输出CSV.所以像这样:
_chunk_size = 630100
column_mapping = {
'first_output_specification' : ['Scen', 'MS', 'Time', 'CCF2', 'ESW10'],
# ..... similar mappings for rest of output specifications
}
union_of_used_cols = ['Scen', 'MS', 'Time', 'CCF1', 'CCF2', 'VS', 'ESW 0.00397', 'ESW0.08',
'ESW0.25', 'ESW1', 'ESW 2', 'ESW3', 'ESW 5', 'ESW7', 'ESW 10', 'ESW12',
'ESW 15', 'ESW18', 'ESW 20', 'ESW22', 'ESW 25', 'ESW30', 'ESW 35',
'ESW40']
chnk_iter = pd.read_csv('my_big_csv.csv', header=0, index_col=False,
iterator=True, na_filter=False, usecols=union_of_used_cols)
cnt = 0
while cnt < 100:
chnk = chnk_iter.get_chunk(_chunk_size) …Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的系列。
In[10]: month_series
Out[10]:
2016-01-01 4880
2016-02-01 4579
2016-03-01 6726
2016-04-01 1778
2016-05-01 3303
2016-06-01 5402
2016-07-01 1207
2016-08-01 6176
2016-09-01 5586
2016-10-01 2802
2016-11-01 6944
2016-12-01 3580
2017-01-01 9336
dtype: int64
Run Code Online (Sandbox Code Playgroud)
我只想构建一个条形图来比较月与月,这看起来很简单
In[11]: month_series.plot(kind='bar')
Out[11]:
Run Code Online (Sandbox Code Playgroud)
我真的不需要比这更多的东西了,但我的问题是日期在 x 轴上看起来很糟糕 - 我随后想格式化日期,以便我只提供年份和月份,例如%Y-%m. 我怎么能这样做?
我的挣扎
因此,查看文档,pandas.Series.plot我看到了xticks可以传递的参数,并且图我可以strftime用来格式化日期并作为序列传递.. 但这不起作用,因为刻度需要数值或日期,而不是字符串。
所以我想我应该只使用原始 matplotlib,这样我就可以使用set_major_formatteraDateFormatter来修改刻度标签。但是,如果我只使用plt.bar,则会引入一个新问题 - 使用整个日期范围,这是有道理的。
In[17]: plt.bar(month_sereis.index, month_sereis.values)
Out[17]: <Container object of 13 artists>
Run Code Online (Sandbox Code Playgroud)
在这一点上,我非常确信我遗漏了一些东西,并且有一种非常简单的方法可以做到这一点。
我将在前言中说这是一个玩具示例 - 我确实有这样做的动机,因为它处于其他一些链式操作的中间.
我有一个像DataFrame的东西
df
Out[234]:
host1 host2 host3
dates
2014-02-02 1 3 4
2014-02-03 5 2 1
2014-02-04 2 5 6
2014-02-05 4 6 1
2014-02-06 3 2 1
Run Code Online (Sandbox Code Playgroud)
我正在尝试生成一个由两列组成的新DataFrame,其中主机是索引 - 一列是最后一行中的值,第二列是最后一行中的值是否大于1.我的相应输出应该看起来喜欢:
newdf
Out[235]:
dates 2014-02-06 passes
host1 3 True
host2 2 True
host3 1 False
Run Code Online (Sandbox Code Playgroud)
如何使用链式操作执行此操作?
我认为,完成输出本身就很容易,我就是这么做的
newdf = df.tail(1).T
newdf['passes'] = newdf.iloc[:, 0] > 1
Run Code Online (Sandbox Code Playgroud)
我正在努力用链式操作进行操作的原因是因为只要我转换尾部,列名就变成了类型pandas.tslib.Timestamp,
df.tail(1).T
Out[236]:
dates 2014-02-06
host1 3
host2 2
host3 1
Run Code Online (Sandbox Code Playgroud)
我似乎无法访问重命名rename,因此我无法在一些布尔操作中访问它assign来创建新的"通过"列.
数据:
我的玩具DataFrame可以生成
df …Run Code Online (Sandbox Code Playgroud) 我知道通过将compression='gzip'参数传递给pd.read_csv()我可以将DataFrame保存到压缩的CSV文件中.
my_df.to_csv('my_file_name.csv', compression='gzip')
Run Code Online (Sandbox Code Playgroud)
我也知道,如果我想将 DataFrame 附加到我可以使用的现有CSV文件的末尾mode='a',就像这样
my_df.to_csv('my_file_name.csv', mode='a', index=False)
Run Code Online (Sandbox Code Playgroud)
但是,如果我想将DataFrame附加到压缩CSV文件的末尾怎么办?这甚至可能吗?我试着这样做
my_df.to_csv('my_file_name.csv', mode='a', index=False, compression='gzip')
Run Code Online (Sandbox Code Playgroud)
但是生成的CSV没有被压缩,尽管条件很好.
这个问题是由我处理带有Pandas的大型CSV文件引起的.我需要生成压缩的CSV输出,并将块文件中的CSV文件处理成DataFrame,这样我就不会遇到MemoryError.因此,对我来说,最看似合乎逻辑的事情是将每个输出DataFrame块一起附加到一个压缩的zip文件中.
我使用的是Python 3.4和Pandas 0.16.1.
我正在做一些补偿.数学工作,我正在尝试使用复杂的数学排序谓词对序列进行排序,该序列并不总是在序列中的两个元素之间定义.我正在尝试更多地了解排序算法,这些算法可以优雅地处理无法进行的元素比较,因为到目前为止我只管理了一个非常基本的方法.
我很抱歉,如果这个问题是一些经典问题,我需要一些时间来定义它,算法设计不是我的强项.
假设我有一个序列A = {a, b, c, d, e}.让我们定义f(x,y)为一个二元函数,通过应用一些复杂的排序标准来返回0if x < y和1if y <= x.
在正常情况下,这将为我们提供足够的细节进行排序A.但是,如果排序标准没有为该特定输入对定义良好,f也可以返回-1.一对输入的未定义是可交换的,即 f(q,r)当且仅当未定义时,它f(r,q)是未定义的.
我想尝试A使用明确定义的排序标准对序列进行排序.
例如,让我们假设
f(a,d) = f(d,a) 未定义. f 都是明确定义的.然后,尽管不知道a和之间的不等式关系d,我们将能够A基于明确定义的排序标准进行排序,只要 在得到的"排序"序列中彼此相邻a并且d彼此不相邻.
例如,假设我们首先确定的相对排序A - {d}是{c, a, b, e},因为所有这些对向f是明确定义的.这可以调用任何排序算法.
然后我们可以打电话 …
假设我有一个NumPy整数数组.
arr = np.random.randint(0, 1000, 1000)
Run Code Online (Sandbox Code Playgroud)
和我有两个阵列lower和upper,它们分别代表上的切片上界和下界arr.这些间隔是重叠的和可变长度,但lowers并uppers都保证是非递减.
lowers = np.array([0, 5, 132, 358, 566, 822])
uppers = np.array([45, 93, 189, 533, 800, 923])
Run Code Online (Sandbox Code Playgroud)
我想找到arr由lowers和定义的每个切片的最小值和最大值uppers,并将它们存储在另一个数组中.
out_arr = np.empty((lowers.size, 2))
Run Code Online (Sandbox Code Playgroud)
最有效的方法是什么?我担心没有矢量化的方法,因为我无法看到我如何绕过循环中的索引.
我目前的做法很简单
for i in range(lowers.size):
arr_v = arr[lowers[i]:uppers[i]]
out_arr[i,0] = np.amin(arr_v)
out_arr[i,1] = np.amax(arr_v)
Run Code Online (Sandbox Code Playgroud)
这让我得到了想要的结果
In [304]: out_arr
Out[304]:
array([[ 26., 908.],
[ 18., 993.],
[ 0., 968.],
[ 3., 999.],
[ 1., 998.], …Run Code Online (Sandbox Code Playgroud) 假设我有一个类似于MultiIndex文档中的示例的MultiIndex DataFrame.
>>> df
0 1 2 3
first second
bar one 0 1 2 3
two 4 5 6 7
baz one 8 9 10 11
two 12 13 14 15
foo one 16 17 18 19
two 20 21 22 23
qux one 24 25 26 27
two 28 29 30 31
Run Code Online (Sandbox Code Playgroud)
我想从这个DataFrame生成一个具有三维结构的NumPy数组
>>> desired_arr
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, …Run Code Online (Sandbox Code Playgroud) 我有一个DataFrame,其中包含以下形式的一些(更具感知力)数据:
In[67] df
Out[67]:
latency
timestamp
2016-09-15 00:00:00.000000 0.042731
2016-09-15 00:16:24.376901 0.930874
2016-09-15 00:33:19.268295 0.425996
2016-09-15 00:51:30.956065 0.570245
2016-09-15 01:09:23.905364 0.044203
...
2017-01-13 13:08:31.707328 0.071137
2017-01-13 13:25:41.154199 0.322872
2017-01-13 13:38:19.732391 0.193918
2017-01-13 13:57:36.687049 0.999191
Run Code Online (Sandbox Code Playgroud)
所以它跨越了大约50天,时间戳不是每天都在同一时间.我想在每天覆盖一些情节,即在同一个地块上检查每一天的时间序列.50天可能是太多的线,但我认为有一种"每日季节性"我想调查,这似乎是一个有用的可视化之前更严格.
如何在表示"单日"时间段的同一图表上叠加此数据?
我的想法
我对熊猫还不是很熟悉,但我设法将我的数据分组到日常垃圾箱中
In[67]: df.groupby(pd.TimeGrouper('D'))
Out[68]: <pandas.core.groupby.DataFrameGroupBy object at 0x000000B698CD34E0>
Run Code Online (Sandbox Code Playgroud)
现在我一直在努力确定我应该如何创建一个新的DataFrame结构,以便可以在白天覆盖这些图.这是我无法弄清楚的基本问题 - 如何利用DataFrameGroupBy对象覆盖图?一个非常基本的看似方法是迭代每个GroupBy对象,但我这样做的问题是配置x轴使得它只显示独立于特定日期的"每日时间段",而不是捕获整个时间戳.
将数据拆分成单独的帧并在同一图中调用它们并使用某种日期强制来在这个更一般的答案中使用该方法对我来说似乎并不是很好.
您可以使用类似的方式生成伪数据:
import datetime
start_date = datetime.datetime(2016, 9, 15)
end_date = datetime.datetime.now()
dts = []
cur_date = start_date
while cur_date < end_date:
dts.append((cur_date, np.random.rand()))
cur_date …Run Code Online (Sandbox Code Playgroud) python ×8
pandas ×7
csv ×2
matplotlib ×2
numpy ×2
performance ×2
plot ×2
python-2.7 ×2
algorithm ×1
arrays ×1
c++ ×1
caching ×1
dataframe ×1
file ×1
gzip ×1
optimization ×1
sorting ×1
vector ×1