- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的数据如下所示:
timedelta64 1, temp1A, temp 1B, temp1C, ...
timedelta64 2, temp2A, temp 2B, temp2C, ...
数据被摄取到两个 numpy 数组中:
一系列时间戳raw_timestamp
, dtype=[('datetime', '<M8[s]')]
'2009-01-01T18:41:00',
'2009-01-01T18:44:00',
'2009-01-01T18:46:00',
'2009-01-01T18:47:00',
传感器数据表 raw_sensor
, dtype=[ ('sensorA', '<u4'), ('sensorB', '<u4'), ('sensorC', '<u4'), ('sensorD', '<u4'), ('sensorE', '<u4'), ('sensorF', '<u4'), ('sensorG', '<u4'), ('sensorH', '<u4'), ('signal', '<u4')]
(755, 855, 755, 855, 743, 843, 743, 843, 2),
(693, 793, 693, 793, 693, 793, 693, 793, 1),
(755, 855, 755, 855, 743, 843, 743, 843, 2),
(693, 793, 693, 793, 693, 793, 693, 793, 1),
我生成了一个新的filled_timestamp
并在每个时间步的每一行填充时间戳:filled_timestamp = np.arange(np.datetime64(starttime), np.datetime64(endtime), np.timedelta64(interval))
使用idxs = np.in1d(filled_timestamp,raw_timestamp)
,我有 filled
的所有索引与raw
的时间戳相匹配。所以我可以分配 filled_sensor
与 raw_sensor
中的匹配数据
filled_sensor[idxs] = raw_sensor
Q1。有没有更好/更快的方法来交叉这些?
现在filled
数组看起来像:
>>> filled_timestamp, filled_sensor # shown side-by-side for convenience
array([
1 # ('2009-01-01T18:41:00') (755, 855, 755, 855, 743, 843, 743, 843, 2),
2 # ('2009-01-01T18:42:00') (0, 0, 0, 0, 0, 0, 0, 0, 0),
3 # ('2009-01-01T18:43:00') (0, 0, 0, 0, 0, 0, 0, 0, 0),
4 # ('2009-01-01T18:44:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
5 # ('2009-01-01T18:45:00') (0, 0, 0, 0, 0, 0, 0, 0, 0),
6 # ('2009-01-01T18:46:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
7 # ('2009-01-01T18:47:00') (693, 793, 693, 793, 693, 793, 693, 793, 1)
],
dtype=[('datetime', '<M8[s]')], [('sensorA', '<u4'), ('sensorB', '<u4'), ('sensorC', '<u4'), ('sensorD', '<u4'), ('sensorE', '<u4'), ('sensorF', '<u4'), ('sensorG', '<u4'), ('sensorH', '<u4'), ('signal', '<u4')]
第二季度。如何使用前一个非空行中的值填充缺失的行?除了列(0 和 3 以及最后一列)外,填充值为 0
在我上面的例子中:
第 2 行和第 3 行将从第 1 行获取值,
第 5 行将从第 4 行获取值
最终结果:
>>> filled_timestamp, filled_sensor # shown side-by-side for convenience
array([
1 # ('2009-01-01T18:41:00') (755, 855, 755, 855, 743, 843, 743, 843, 2),
2 # ('2009-01-01T18:42:00') (0, 855, 755, 0, 743, 843, 743, 843, 0),
3 # ('2009-01-01T18:43:00') (0, 855, 755, 0, 743, 843, 743, 843, 0),
4 # ('2009-01-01T18:44:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
5 # ('2009-01-01T18:45:00') (0, 793, 693, 0, 693, 793, 693, 793, 0),
6 # ('2009-01-01T18:46:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
7 # ('2009-01-01T18:47:00') (693, 793, 693, 793, 693, 793, 693, 793, 1)
],
dtype=[('datetime', '<M8[s]')], [('sensorA', '<u4'), ('sensorB', '<u4'), ('sensorC', '<u4'), ('sensorD', '<u4'), ('sensorE', '<u4'), ('sensorF', '<u4'), ('sensorG', '<u4'), ('sensorH', '<u4'), ('signal', '<u4')]
最佳答案
交叉路口
快速交叉路口的最佳选择可能是 np.searchsorted
。它将在 filled_timestamp
中进行二分搜索对于 raw_timestamp
的元素:
idx = np.searchsorted(filled_timestamp, raw_timestamp)
仅当 raw_timestamp
的每个元素都正确时,这才是准确的实际上发生在 filled_timestamp
因为np.searchsorted
无论如何都会返回插入索引。
非矢量化解决方案
您想要设置 filled_sensor
的切片来自idx[n]
至idx[n + 1]
值为 raw_sensor[n]
:
from itertools import zip_longest
for start, end, row in zip_longest(idx, idx[1:], raw_sensor):
filled_sensor[start:end] = row
我正在使用zip_longest
这里最后一个值来自 idx[1:]
将是None
,使最后一个切片等于 filled_sensor[idx[-1]:]
无需特殊条件。
矢量化解决方案
您可以创建filled_sensor
直接来自raw_sensor
如果您知道要重复 raw_sensor
中的哪些索引。您可以通过申请 np.cumsum
获取该信息至idx
转换为 bool 数组:
idx_mask = np.zeros(filled_timestamp.shape, np.bool)
idx_mask[idx] = True
基本上,我们从一个与 filled_timestamp
大小相同的 bool 数组开始即True
(1) 无论来自 raw_timestamp
的条目火柴。我们可以将其转换为 raw_timestamp
中的索引通过计算到目前为止发生的总匹配数:
indexes = np.cumsum(idx_mask) - 1
请记住 indexes
是整数数组,而不是 bool 值。每当找到新的匹配项时,它就会增加。 - 1
从计数转换为索引,因为第一个匹配项的计数为 1 而不是 0。
现在你可以制作filled_sensor
:
filled_sensor = raw_sensor[indexes]
这里唯一可能的警告是 if filled_sensor[0]
不是来自 raw_sensor[0]
。然后它将被替换为 raw_sensor[-1]
。鉴于您如何在 filled
中构建时间基于raw
,我不确定是否会成为一个问题。
示例
以下是交集和矢量化解决方案步骤的示例,其中包含您在问题中显示的数据。
我们从
开始raw_timestamp = np.array(['2009-01-01T18:41:00',
'2009-01-01T18:44:00',
'2009-01-01T18:46:00',
'2009-01-01T18:47:00',], dtype='datetime64[s]')
raw_sensor = np.array([(755, 855, 755, 855, 743, 843, 743, 843, 2),
(693, 793, 693, 793, 693, 793, 693, 793, 1),
(755, 855, 755, 855, 743, 843, 743, 843, 2),
(693, 793, 693, 793, 693, 793, 693, 793, 1),],
dtype=[('sensorA', '<u4'), ('sensorB', '<u4'),
('sensorC', '<u4'), ('sensorD', '<u4'),
('sensorE', '<u4'), ('sensorF', '<u4'),
('sensorG', '<u4'), ('sensorH', '<u4'),
('signal', '<u4')])
我们可以生成filled_timestamp
作为
filled_timestamp = np.arange('2009-01-01T18:41:00',
'2009-01-01T18:48:00', 60, dtype='datetime64[s]')
其产量如预期:
array(['2009-01-01T18:41:00', '2009-01-01T18:42:00', '2009-01-01T18:43:00',
'2009-01-01T18:44:00', '2009-01-01T18:45:00', '2009-01-01T18:46:00',
'2009-01-01T18:47:00'], dtype='datetime64[s]')
我对 dtypes
有一点随意。通过将时间戳设为普通数组而不是结构化数组,但我认为这对您的目的没有什么影响。
idx = np.searchsorted(filled_timestamp, raw_timestamp)
产量
idx = np.array([0, 3, 5, 6], dtype=np.int)
这意味着索引 0, 3, 5, 6
在filled_timestamp
匹配 raw_timestamp
中的值.
idx_mask
然后变成
idx_mask = np.array([True, False, False, True, False, True, True], dtype=np.bool)
这基本上与idx
同义。 ,除了扩展为与 filled_timestamp
大小相同的 bool 掩码.
现在是棘手的部分:indexes = np.cumsum(idx_mask) - 1
:
indexes = array([0, 0, 0, 1, 1, 2, 3], dtype=np.int)
这可以解释如下:filled_sensor[0:3]
应该来自raw_sensor[0]
。 filled_sensor[3:5]
应该来自raw_sensor[1]
, filled_sensor[5]
应该来自raw_sensor[2]
, filled_sensor[6]
应该来自raw_sensor[3]
.
所以现在我们使用 indexes
直接提取 raw_sensor
的正确元素使用filled_sensor = raw_sensor[indexes]
:
np.array([(755, 855, 755, 855, 743, 843, 743, 843, 2),
(755, 855, 755, 855, 743, 843, 743, 843, 2),
(755, 855, 755, 855, 743, 843, 743, 843, 2),
(693, 793, 693, 793, 693, 793, 693, 793, 1),
(693, 793, 693, 793, 693, 793, 693, 793, 1),
(755, 855, 755, 855, 743, 843, 743, 843, 2),
(693, 793, 693, 793, 693, 793, 693, 793, 1)],
dtype=[('sensorA', '<u4'), ('sensorB', '<u4'),
('sensorC', '<u4'), ('sensorD', '<u4'),
('sensorE', '<u4'), ('sensorF', '<u4'),
('sensorG', '<u4'), ('sensorH', '<u4'),
('signal', '<u4')])
关于python - numpy时间序列合并并用较早的值填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43924459/
padding:initial 比 padding:0 有什么优势吗?示例: textarea { padding: 0; } Hello, world! 最佳答案 它们的意思是一
我尝试通过按钮填充 JList,然后在先前填充的 Jlist 上使用 DoubleClick 填充 JTextField。 代码: private void extractUsedVariables
我正在尝试做 var width = ($(this).width() + $(this).css('padding-left') + $(this).css('padding-right' ));
我在导航中添加了悬停效果,遗憾的是悬停也影响了上面的文字。如何在不影响文本位置的情况下向导航添加悬停? 可悲的是,我找不到解决这个问题的方法。 HTML 模板:http://projects.help
我是 F# 初学者,下面代码中的 %-5s 和 %5s 有什么作用?我认为它提供了空间填充,但我不确定它是如何填充的? printfn "%-5s %5s" "a" "b" 当我尝试 prin
我需要选择带狗的用户(带 type 等于“狗”的宠物) var User = Waterline.Collection.extend({ identity: 'user', attribute
我一直在尝试让 Excel 在一组列上应用公式,然后将模式扩展到整个行集。 这导致了以下代码: For i = 0 To avgsheetNames.Count - 1 If Contains(CSt
随着 Flutter 2.0 的发布,FlatButton已被替换为 TextButton . 因此,填充属性不再直接可用,而是作为 ButtonStyle属性(property)。 我的问题是,我该
这似乎是一个简单的问题,但我已经尝试了一个小时,似乎无法弄清楚。 我要做的就是用 Canvas 填充 MainWindow。我找不到任何允许这样做的属性,我能想到的唯一方法是设置 Canvas.Wid
这是a website具有移动 View 。 网站宽度为 640 像素,但 iPhone 以 678 像素渲染文档。在 Android 中看起来很棒。 我添加了视口(viewport)元: 主体 C
我正在使用 GridBagLayout到(当前)显示两行。我知道这种布局对于这项任务来说太过分了,但我正在努力学习如何使用它。问题是我已将两个面板添加到两个单独的行中,并且内容周围存在巨大差距(请参见
我有以下代码已传递给我并创建多边形: var map; function initialize() { var myLatlng = new google.maps.LatLng(-36.4
我在 Jpanel 中有一些项目,然后将其推到顶部并用作基本搜索引擎的工具栏。我遇到一个问题,因为没有足够的空间,所以我的最后一个组合框没有显示。但是,左侧有很多空白空间,我需要移动所有内容来填充 J
我创建了带有阈值的二进制图像。如下图所示如何改变白色形状的颜色以使其可索引? 到目前为止,这是我的代码: void threshold() { cv::Mat src_8uc3_img = c
我有一个 JTable,我想知道是否有更好的方法来填充它,这是我的代码: //Metodo para llenar un jtable con datos de la base public stat
我想要做的是裁剪一个卷以删除所有不相关的数据。例如,假设我有一个 100x100x100 的体积,其中填充了 0,但其中的 50x50x50 体积则填充了 1。如何从原始体积中获得裁剪后的 50x50
因此,我正在创建一种对一组数字进行洗牌的方法,其想法是创建这些数字的总体。因此,我创建了一个循环,对数字进行洗牌,然后将其添加到数组列表中,但是经过一些调试语句后,我发现它确实对数字进行洗牌,但只将最
假设我有这两个类: public class A where T : IEntityWithID, new() { private static EntityInfo entityInfo =
我正在尝试添加用户输入的两个大整数作为字符串。当两个输入字符串的长度不同时,我尝试用零填充较短的数字,但它不起作用。因此,如果我输入 456 和 7,它会给出 3,前面有一些随机字符。感谢您的任何建议
这是我将内容打印到表格 View 的代码 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: Index
我是一名优秀的程序员,十分优秀!