- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
处理我想要旋转的数据。请注意,我仅限于 numpy,无法使用 pandas。原始数据如下所示:
data = [
[ 1, a, [<metric1>, <metric2>] ],
[ 1, b, [<metric1>, <metric2>] ],
[ 2, b, [<metric1>, <metric2>] ],
[ 2, c, [<metric1>, <metric2>] ],
[ 3, a, [<metric1>, <metric2>] ],
[ 3, c, [<metric1>, <metric2>] ],
...etc
]
使用 numpy 旋转我的数据:
rows, row_pos = np.unique(data[:, row_index], return_inverse=True)
cols, col_pos = np.unique(data[:, col_index], return_inverse=True)
pivot_table = np.zeros((len(rows), len(cols)), dtype=object)
pivot_table[row_pos, col_pos] = data[:, pivot_index]
结果格式为:
cols = [a, b, c, ...]
rows = [1, 2, 3, ...]
pivot_table = [
[ [<metric1>, <metric2>], [<metric1>, <metric2>], 0, ... ],
[ 0, [<metric1>, <metric2>], [<metric1>, <metric2>], ... ],
[ [<metric1>, <metric2>], 0, [<metric1>, <metric2>], ... ],
...
]
最终呈现透视表,它会在其中记录零的位置,并将创建正确数量的单元格,以便表的格式正确。
这只是一个临时解决方法,因为最初我尝试用 numpy 数组替换零(即 [0,0])
pivot_table[pivot_table == 0] = [0,0]
但我收到以下错误:
TypeError: NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 2 dimensions
我的临时修复已经足够了,但是当我想做一些事情(例如获得一行列总和)时,我的临时修复会受到限制。我有很多方法,但不知道如何执行:
np.unique
中的索引创建表时,有一个默认值来填充表格,而不是零。[ 1, a, <metric1>, <metric2> ]
。这可能是简化聚合函数的最佳解决方案。对于上述任何一种方法有什么解决方案吗?
最佳答案
尝试重新创建您的案例:
In [182]: a,b,c = 0,1,2
In [183]: metric1, metric2 = 100,200
In [186]: data = [
...: [ 1, a, [metric1, metric2] ],
...: [ 1, b, [metric1, metric2] ],
...: [ 2, b, [metric1, metric2] ],
...: [ 2, c, [metric1, metric2] ],
...: [ 3, a, [metric1, metric2] ],
...: [ 3, c, [metric1, metric2] ],
...: ]
In [187]:
In [187]: data
Out[187]:
[[1, 0, [100, 200]],
[1, 1, [100, 200]],
[2, 1, [100, 200]],
[2, 2, [100, 200]],
[3, 0, [100, 200]],
[3, 2, [100, 200]]]
In [189]: data = np.array(data,object)
In [190]: rows, row_pos = np.unique(data[:, 0], return_inverse=True)
...: cols, col_pos = np.unique(data[:, 1], return_inverse=True)
...: pivot_table = np.zeros((len(rows), len(cols)), dtype=object)
In [191]: pivot_table
Out[191]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]], dtype=object)
In [192]: pivot_table[row_pos, col_pos] = data[:, 2]
In [193]: pivot_table
Out[193]:
array([[list([100, 200]), list([100, 200]), 0],
[0, list([100, 200]), list([100, 200])],
[list([100, 200]), 0, list([100, 200])]], dtype=object)
In [194]: pivot_table[row_pos, col_pos]
Out[194]:
array([list([100, 200]), list([100, 200]), list([100, 200]),
list([100, 200]), list([100, 200]), list([100, 200])], dtype=object)
In [195]: _.shape
Out[195]: (6,)
In [196]: data[:,2].shape
Out[196]: (6,)
此分配在源形状(和数据类型)与目标形状 (6,) 匹配之间起作用。
In [197]: mask = pivot_table==0
In [198]: mask
Out[198]:
array([[False, False, True],
[ True, False, False],
[False, True, False]])
In [199]: pivot_table[mask]
Out[199]: array([0, 0, 0], dtype=object)
In [200]: pivot_table[mask] = [0,0]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-200-83e0a7422802> in <module>()
----> 1 pivot_table[mask] = [0,0]
ValueError: NumPy boolean array indexing assignment cannot assign 2 input values to the 3 output values where the mask is true
不同的错误消息(不同的 numpy 版本?),但这表示我正在尝试将 2 个值放入 3 个槽中。它不处理 [0,0]
作为单个项目,但作为 2。
分配标量元素没有问题:
In [203]: pivot_table[mask] = None
In [204]: pivot_table
Out[204]:
array([[list([100, 200]), list([100, 200]), None],
[None, list([100, 200]), list([100, 200])],
[list([100, 200]), None, list([100, 200])]], dtype=object)
过去我使用 frompyfunc
取得了成功创建对象数据类型数组。定义一个小函数。我本来可以测试 0 或 type,但由于我已经插入了 None,所以让我们测试一下:
In [205]: def fun(x):
...: if x is None: return [0,0]
...: return x
将其应用于 pivot_table
的每个元素,生成一个新数组。
In [230]: arr1 = np.frompyfunc(fun,1,1)(pivot_table)
In [231]: arr1
Out[231]:
array([[list([100, 200]), list([100, 200]), list([0, 0])],
[list([0, 0]), list([100, 200]), list([100, 200])],
[list([100, 200]), list([0, 0]), list([100, 200])]], dtype=object)
另一种方法,让我们尝试分配列表的列表:
In [240]: pivot_table[mask] = [[0,0] for _ in range(3)]
TypeError: NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 2 dimensions
但是如果我尝试用 where
做同样的事情,它有效:
In [241]: pivot_table[np.where(mask)] = [[0,0] for _ in range(3)]
In [242]: pivot_table
Out[242]:
array([[list([100, 200]), list([100, 200]), list([0, 0])],
[list([0, 0]), list([100, 200]), list([100, 200])],
[list([100, 200]), list([0, 0]), list([100, 200])]], dtype=object)
与 where
它更像是您对 pivot_table
的原始分配.
In [243]: np.where(mask)
Out[243]: (array([0, 1, 2]), array([2, 0, 1]))
此数组索引在广播方面仍然可能存在问题,
In [244]: pivot_table[np.where(mask)] = [0,0]
ValueError: cannot copy sequence with size 2 to array axis with dimension 3
通常 bool 掩码索引的行为类似于 np.where(mask)
索引,但显然这里对象数据类型和广播的相互作用与 bool 索引困惑。
Out[231]
仍然是一个 (3,3) 数组,即使 a len 2 列出了所有元素。要将其转换为数值数组,我们必须执行以下操作:
In [248]: p = np.stack(pivot_table.ravel()).reshape(3,3,2)
In [249]: p
Out[249]:
array([[[100, 200],
[100, 200],
[ 0, 0]],
[[ 0, 0],
[100, 200],
[100, 200]],
[[100, 200],
[ 0, 0],
[100, 200]]])
np.concatenate
(和*stack
版本)可以将列表连接到数组中,但它必须以列表或平面数组开头,因此需要ravel和reshape。
np.array(pivot_table.tolist())
也有效。
如果您构建了一个结构化数据数组(假设 metric
值是数字):
In [265]: data1 = np.array([tuple(x.tolist()) for x in data],'i,i,2i')
In [266]: data1
Out[266]:
array([(1, 0, [100, 200]), (1, 1, [100, 200]), (2, 1, [100, 200]),
(2, 2, [100, 200]), (3, 0, [100, 200]), (3, 2, [100, 200])],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4', (2,))])
In [267]: data1['f2']
Out[267]:
array([[100, 200],
[100, 200],
[100, 200],
[100, 200],
[100, 200],
[100, 200]], dtype=int32)
这些值可以分配给 3d 数据透视表:
In [268]: p = np.zeros((len(rows), len(cols),2),int)
In [269]: p[row_pos, col_pos]=data1['f2']
与 fillvalue
Paul Panzer 定义的数组,您的初始屏蔽赋值有效:
In [322]: fillvalue = np.empty((), 'O')
...: fillvalue[()] = [0, 0]
...:
In [323]: fillvalue
Out[323]: array(list([0, 0]), dtype=object)
In [324]: mask
Out[324]:
array([[False, False, True],
[ True, False, False],
[False, True, False]])
In [325]: pivot_table[mask] = fillvalue
他的full
做np.copyto(a, fill_value, casting='unsafe')
, 我们的屏蔽作业可以写成:np.copyto(pivot_table, fillvalue, where=mask)
关于python - Numpy:用 numpy 数组替换 numpy 数组中的零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53450669/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!