小编And*_*rtz的帖子

ActiveRecord:查询不为STI子类使用正确的类型条件

我有一组继承自基类的STI子User类.我发现在子类定义内的某些条件下,对子类的查询没有正确使用type条件.

class User < ActiveRecord::Base
  # ...
end

class Admin < User
  Rails.logger.info "#{name}: #{all.to_sql}"
  # ...
end
Run Code Online (Sandbox Code Playgroud)

在开发中加载Rails控制台时,它可以实现我的期望:

Admin: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Admin')
Run Code Online (Sandbox Code Playgroud)

但是当击中应用程序(localhost/pow)时,它缺少type条件,我得到了这个:

Admin: SELECT `users`.* FROM `users`
Run Code Online (Sandbox Code Playgroud)

但是当部署到登台服务器时,不是来自应用程序:

Admin: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Admin')
Run Code Online (Sandbox Code Playgroud)

当然,这会导致在dev应用程序(但不是从控制台)执行的任何查询都不正确.具体来说,我试图预加载现有数据库值的(小)缓存,以便根据这些数据创建一些有用的方法.没有类型范围,缓存显然是不正确的!

从同一个位置(Admin),我们得到以下令人困惑的矛盾:

[11] pry(Admin)> Admin.finder_needs_type_condition?
=> true
[12] pry(Admin)> Admin.send(:type_condition).to_sql
=> "`users`.`type` IN ('Admin')"
[13] pry(Admin)> Admin.all.to_sql
=> "SELECT `users`.* FROM `users`"
Run Code Online (Sandbox Code Playgroud)

此外,我Q < Useruser.rb …

ruby activerecord development-environment ruby-on-rails sti

10
推荐指数
1
解决办法
850
查看次数

Python:在任意维度中使用冒号运算符索引数组

我有一个numpy nd数组.我的任务的简化版本是沿每个轴取一个向量.为了显示:

import numpy
x = numpy.array(range(24)).reshape((2,3,4))
x0 = x[0,0,:]
x1 = x[0,:,0]
x2 = x[:,0,0]
Run Code Online (Sandbox Code Playgroud)

但是,我不一定知道x将具有的维数.因此,挑战在于如何将冒号:索引运算符放在可变位置.这种语法的示例如下:

n = x.ndim
ind = list(np.zeros(n))
dim = 0
ind[dim] = ':'
y = x[ind]
Run Code Online (Sandbox Code Playgroud)

要么

y = indexer.index(x,ind)
Run Code Online (Sandbox Code Playgroud)

对于某些模块索引器.我可以写它,但我觉得这必须已经解决,我不能成为唯一一个想要这样做的人.例如,在MATLAB中,您可以使用subsref()函数执行此操作.

python/numpy/other模块中是否存在任何此类构造?

python arrays numpy colon matrix-indexing

9
推荐指数
1
解决办法
4768
查看次数

Numpy坐标矩阵

我正在尝试获得一个坐标数组矩阵.这与numpy.meshgrid不同.例如,对于2x2尺寸,我想要2x2x2输出

[[[0,0],[0,1]],
 [[1,0],[1,1]]]
Run Code Online (Sandbox Code Playgroud)

作为一个numpy数组.这可能看起来和读取更清晰的2x2元组矩阵:

[[(0,0),(0,1)],
 [(1,0),(1,1)]]
Run Code Online (Sandbox Code Playgroud)

(除了我不认为你可以在一个numpy数组中有元组,这不是重点)

这个简单的例子可以通过切换numpy-meshgrid输出的轴来完成(具体来说,将第一个轴移动到最后):

np.array(np.meshgrid([0,1],[0,1])).transpose([1,2,0])
Run Code Online (Sandbox Code Playgroud)

这可以很容易地推广到任意维度,除了meshgrid不像我期望的那样超过2个输入.具体来说,返回的矩阵具有沿奇数顺序的轴变化的坐标值:

In [627]: np.meshgrid([0,1],[0,1],[0,1])
Out[627]:
[array([[[0, 0],
        [1, 1]],

       [[0, 0],
        [1, 1]]]),
 array([[[0, 0],
        [0, 0]],

       [[1, 1],
        [1, 1]]]),
 array([[[0, 1],
        [0, 1]],

       [[0, 1],
        [0, 1]]])]
Run Code Online (Sandbox Code Playgroud)

请注意,此输出的元素分别沿轴1,0和2变化.这将构建一个不正确的坐标矩阵; 我需要输出按顺序沿轴0,1和2变化.所以我能做到

In [642]: np.array(np.meshgrid([0,1],[0,1],[0,1])).swapaxes(1,2)
Out[642]:
array([[[[0, 0],
         [0, 0]],

        [[1, 1],
         [1, 1]]],


       [[[0, 0],
         [1, 1]],

        [[0, 0],
         [1, 1]]],


       [[[0, 1],
         [0, 1]],

        [[0, 1],
         [0, 1]]]])
Run Code Online (Sandbox Code Playgroud)

但这开始变得非常hacky,我不知道我是否可以依靠高维网格网格输出中的这个顺序.numpy.mgrid给出正确的顺序,但似乎不允许任意值,我将需要.所以这归结为两个问题:

1)是否有一种更清洁的方式,也许是我缺少的numpy中的某些功能,它会生成如上所述的坐标向量矩阵?2)这个奇怪的排序真的是我们对meshgrid的期望吗?这一点是否有我可以指望的规格?

[编辑]关注Jaime的解决方案,这是一个更通用的功能,可以为任何感兴趣的人更明确地构建它:[编辑2,修复了一个错误,可能是另一个,现在不能花费更多的时间,这个真的需要成为一个更常见的功能...]

def build_coords(*vecs):
    coords = numpy.empty(map(len,vecs)+[len(vecs)])
    for ii in xrange(len(vecs)): …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy matrix coordinates

7
推荐指数
3
解决办法
2万
查看次数

javascript / lodash 按功能进行二分搜索

对于大多数此类操作,我们使用 lodash 库。我愿意接受其他建议,但可能只是在导入新库之前自己编写函数。

lodash has sortedIndexOf,它在排序数组中执行二分搜索(如果没有找到则返回匹配的索引或 -1)。它还具有sortedIndexBy,它使用二分搜索找到索引以插入新元素,您可以在其中指定用于进行排序比较的函数(如果未找到,则返回有效索引)

我找不到使用允许您指定排序值函数的高效排序搜索进行查找的函数(仅在找到时返回索引)。它可能看起来像这样:

_.sortedFindBy(array, value, function(x){x.timestamp})
Run Code Online (Sandbox Code Playgroud)

我相信我可以用

var idx = _.sortedIndexBy(array, value, function(x){x.timestamp})
return (array[idx] && array[idx].timestamp === value.timestamp) ? idx : -1
Run Code Online (Sandbox Code Playgroud)

但对我来说,没有一个已经功能丰富的排序搜索函数集的语法更紧凑和更直观的形式似乎很奇怪。

我是否遗漏了 lodash 文档中的某些内容?有没有内置的方法可以更惯用地做到这一点?还是我应该使用我的额外检查方法?

javascript binary-search lodash

7
推荐指数
1
解决办法
5118
查看次数

在python中绘制3D矩阵的最佳方法

我正在尝试可视化3D数据.这是一个完整的3D矩阵:每个(x,y,z)坐标都有一个值,不同于表面或单个数据向量的集合.我试图这样做的方法是绘制一个不透明的立方体,其中立方体的每个边显示正交维度上的数据总和.

一些示例数据 - 基本上是以(3,5,7)为中心的blob:

import numpy as np
(x,y,z) = np.mgrid[0:10,0:10, 0:10]
data = np.exp(-((x-3)**2 + (y-5)**2 + (z-7)**2)**(0.5))
edge_yz = np.sum(data,axis=0)
edge_xz = np.sum(data,axis=1)
edge_xy = np.sum(data,axis=2)
Run Code Online (Sandbox Code Playgroud)

因此,我们的想法是生成一个显示立方体的3D图; 立方体的每个表面将显示适当的2D矩阵edge_*.这就像在适当的3D位置绘制3个4边多边形(如果你也做了立方体的背面则为6),除了每个多边形实际上是要用颜色绘制的值矩阵.

我目前最好的近似是计算包含偏斜版边缘的较大矩阵,并将这些矩阵连接成一个更大的2D矩阵,并将imshow()表示为更大的矩阵.看起来非常笨拙,并做了很多工作,matplotlib或m3plot中的某些引擎或我确定已经做过的事情.它也只能在单个视角下查看静态图像,但这不是我现在需要克服的.

有没有一种很好的方法可以使用现有的python工具在真正的3D绘图中绘制这些立方体边缘?有没有更好的方法来绘制3D矩阵?

python 3d matplotlib

6
推荐指数
2
解决办法
7795
查看次数

命令行循环中的bg/fg

ctrl-z(^ z)以从终端执行的循环内部完成时无法理解的方式起作用.

说我输入

for ii in {0..100}; do echo $ii; sleep 1; done
Run Code Online (Sandbox Code Playgroud)

然后我打了^ z.我去拿:

[1]+  Stopped                 sleep 1
Run Code Online (Sandbox Code Playgroud)

我可以使用fg或bg恢复工作,但是工作仅指他的睡眠命令.循环的其余部分显然已消失,终端上不再出现任何数字.

我可以在命令之后使用&立即在后台运行它,或者另一个解决方案是将整个内容包装在子shell中:

( for ii in {0..100}; do echo $ii; sleep 1; done )
Run Code Online (Sandbox Code Playgroud)

然后^ z给了我

[1]+  Stopped                 ( for ii in {0..100};
do
    echo $ii; sleep 1;
done )
Run Code Online (Sandbox Code Playgroud)

这项工作可以恢复,每个人都很开心.但是,在执行一次性任务时,我通常不习惯这样做,我问的问题是为什么第一个行为首先发生.有没有办法暂停一个没有子shell的命令行循环?在第一个例子中,循环的其余部分发生了什么?

请注意,这特定于循环:

echo 1; sleep 5; echo 2
Run Code Online (Sandbox Code Playgroud)

并在睡眠期间点击^ z导致echo 2执行:

1
^Z
[2]+  Stopped                 sleep 5
2
Run Code Online (Sandbox Code Playgroud)

或者我应该养成使用&的习惯并称之为黑魔法?

bash jobs job-control

6
推荐指数
1
解决办法
466
查看次数

使用wave(而不是scipy.io.wavfile)模块将numpy数组写入缓冲区中的wave文件

这让我感到头疼一天,但是因为我已经弄清楚了,所以我想把它贴在某个地方以防它有用.

我正在使用python的wave模块将数据写入wave文件.我不使用scipy.io.wav文件,因为数据可以是一个巨大的向量(16kHz的音频小时数),我不想/不能一次加载到内存中.我的理解是scipy.io.wavfile只为你提供了全文件接口,而wave可以让你在缓冲区中读写.如果我错了,我很乐意纠正.

我遇到的问题归结为如何将float数据转换为wave.writeframes函数的字节.我的数据没有以正确的顺序写入.这是因为我使用numpy.getbuffer()函数将数据转换为字节,这不符合数据的方向:

x0 = np.array([[0,1],[2,3],[4,5]],dtype='int8')
x1 = np.array([[0,2,4],[1,3,5]],dtype='int8').transpose()
if np.array_equal(x0, x1):
    print "Data are equal"
else:
    print "Data are not equal"
b0 = np.getbuffer(x0)
b1 = np.getbuffer(x1)
Run Code Online (Sandbox Code Playgroud)

结果:

Data are equal

In [453]: [b for b in b0]
Out[453]: ['\x00', '\x01', '\x02', '\x03', '\x04', '\x05']

In [454]: [b for b in b1]
Out[454]: ['\x00', '\x02', '\x04', '\x01', '\x03', '\x05']
Run Code Online (Sandbox Code Playgroud)

我假设字节的顺序由内存中的初始分配决定,因为numpy.transpose()不会重写数据而只返回一个视图.但是,由于这个事实被numpy数组的接口所掩盖,所以在知道这是问题之前调试它是一个很糟糕的事情.

一个解决方案是使用numpy的tostring()函数:

s0 = x0.tostring()
s1 = x1.tostring()
In [455]: s0
Out[455]: '\x00\x01\x02\x03\x04\x05'

In [456]: s1
Out[456]: '\x00\x01\x02\x03\x04\x05'
Run Code Online (Sandbox Code Playgroud)

对于首先说tostring()函数的人来说,这可能是显而易见的,但不知怎的,我的搜索并没有挖掘出任何关于如何格式化整个numpy数组以进行波形文件编写而不是使用scipy.io.wavfile的文档.所以这就是.只是为了完成(请注意,"功能"最初是n_channels x …

python audio numpy wave

6
推荐指数
1
解决办法
2633
查看次数

__FILE__ == $ PROGRAM_NAME在ruby中意味着什么?

在查看Ruby中的代码时,我偶然发现了这个sintax.代码是:

if __FILE__ == $PROGRAM_NAME
  #some code...
end
Run Code Online (Sandbox Code Playgroud)

我想__FILE__是一个变量,它让我知道我所在文件的名称?但那么什么是$PROGRAM_NAMEsimbolize呢?另外,为什么这个if语句是必要的,因为程序可以使用或不使用它?

ruby variables special-variables

6
推荐指数
1
解决办法
4658
查看次数

更快n选择k组合红宝石组合

在尝试解决"网格上的路径"问题时,我编写了代码

def paths(n, k)
  p = (1..n+k).to_a
  p.combination(n).to_a.size
end
Run Code Online (Sandbox Code Playgroud)

代码工作正常,例如if n == 8 and k == 2代码返回45正确的路径数.

但是,当使用更大的数字时代码非常慢,我正在努力弄清楚如何加快这个过程.

ruby combinatorics

5
推荐指数
2
解决办法
1188
查看次数

静态服务时,来自不同组件的 React + Material-UI 样式类会发生冲突

问题:重新渲染组件时,应用于由 Material-UI/JSS 生成的类名的样式会错误地更改。

设置:我正在提供一个create-react-app使用 Material-UI jss 样式和 Rails 后端的 React 应用程序(使用 构建)。我不确定 Rails 部分的相关性,因为当我build/index.html直接在本地机器上打开文件时会发生同样的事情——Rails 后端处理根请求以提供静态客户端文件,如此处所示。在任何一种情况下,静态构建都是使用 来创建的npm run build,它运行react-scripts build(从create-react-app)。

问题示例:我有一个<img>给定的元素className: {classes.logo}。构建后,classes.logois "jss3",它采用以下正确的 CSS:

.jss3 {
    height: 50px;
    position: relative;
    // [...more]
}
Run Code Online (Sandbox Code Playgroud)

这看起来像这样 -<img>组件位于应用程序标题的左上角。

在此处输入图片说明

我“继续作为客人”,并呈现新组件。但是请注意徽标图像,它现在具有新样式:

在此处输入图片说明

发生了什么?该<img>组件现在显示以下样式:

.jss3 {
    height: 2em;
    padding: 7px;
    overflow: scroll;
    position: relative;
}
Run Code Online (Sandbox Code Playgroud)

这个 css 来自不同组件的完全不同的样式对象:

// FileEntry.js

  fileEntry: {
    position: 'relative',
    padding: …
Run Code Online (Sandbox Code Playgroud)

reactjs material-ui jss

5
推荐指数
1
解决办法
3458
查看次数