我需要我的代码根据编译它的操作系统做不同的事情.我正在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?有没有更好的方法来做同样的事情?
程序生成最近引起了人们的关注(由Spore,MMO等),它似乎是一种有趣/强大的编程技术.
我的问题是这些:
说我有一个foo
我想要打电话的功能n
.在Ruby中,我会写:
n.times { foo }
Run Code Online (Sandbox Code Playgroud)
在Python中,我可以写:
for _ in xrange(n): foo()
Run Code Online (Sandbox Code Playgroud)
但这似乎是一种做事的hacky方式.
我的问题:在Python中有这样一种惯用的方法吗?
是否可以将类型名称存储为C++变量?例如,像这样:
type my_type = int; // or string, or Foo, or any other type
void* data = ...;
my_type* a = (my_type*) data;
Run Code Online (Sandbox Code Playgroud)
我知道有99.9%的时间有更好的方法来做你想做的事情而不需要使用无效指针,但我很好奇C++是否允许这样的事情.
我有一个2D numpy形状的阵列(N,2),它持有N个点(x和y坐标).例如:
array([[3, 2],
[6, 2],
[3, 6],
[3, 4],
[5, 3]])
Run Code Online (Sandbox Code Playgroud)
我想对它进行排序,使得我的点按x坐标排序,然后在x坐标相同的情况下按y排序.所以上面的数组应该如下所示:
array([[3, 2],
[3, 4],
[3, 6],
[5, 3],
[6, 2]])
Run Code Online (Sandbox Code Playgroud)
如果这是一个普通的Python列表,我只需要定义一个比较器来做我想要的,但据我所知,numpy的sort函数不接受用户定义的比较器.有任何想法吗?
编辑:感谢您的想法!我设置了一个包含1000000个随机整数点的快速测试用例,并对我可以运行的那些进行了基准测试(抱歉,目前无法升级numpy).
Mine: 4.078 secs
mtrw: 7.046 secs
unutbu: 0.453 secs
Run Code Online (Sandbox Code Playgroud) 我有一个矩阵(准确地说是2d numpy ndarray):
A = np.array([[4, 0, 0],
[1, 2, 3],
[0, 0, 5]])
Run Code Online (Sandbox Code Playgroud)
我想A
根据另一个数组中的滚动值独立滚动每一行:
r = np.array([2, 0, -1])
Run Code Online (Sandbox Code Playgroud)
也就是说,我想这样做:
print np.array([np.roll(row, x) for row,x in zip(A, r)])
[[0 0 4]
[1 2 3]
[0 5 0]]
Run Code Online (Sandbox Code Playgroud)
有没有办法有效地做到这一点?也许使用花哨的索引技巧?
我有两个矩阵,A
并且B
:
A = array([[2., 13., 25., 1.], [ 18., 5., 1., 25.]])
B = array([[2, 1], [0, 3]])
Run Code Online (Sandbox Code Playgroud)
我想索引每一行的A
每一行B
,产生切片:
array([[25., 13.], [18., 25.]])
Run Code Online (Sandbox Code Playgroud)
也就是说,我基本上想要这样的东西:
array([A[i,b] for i,b in enumerate(B)])
Run Code Online (Sandbox Code Playgroud)
有没有办法直接指出这个?我能做的最好的就是这个"平板黑客":
A.flat[B + arange(0,A.size,A.shape[1])[:,None]]
Run Code Online (Sandbox Code Playgroud) 如果我有一个数组(在运行时之前长度未知),有没有办法调用一个函数,并将数组的每个元素作为一个单独的参数?
像这样:
foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)
Run Code Online (Sandbox Code Playgroud)
上下文:我有一个n
-d数组的索引列表Q
.我想要的是什么Q(a,b,:)
,但我只有[a,b]
.由于我不知道n
,我不能只是硬编码索引.
matlab operators multidimensional-array splat matrix-indexing
我想通过调用imshow
for循环来显示一个简单的动画.这是我的问题的演示:
import pylab,time
images = [pylab.uniform(0,255,(50,50)) for _ in xrange(40)]
pylab.ion()
timings = []
for img in images:
tic = time.time()
pylab.imshow(img)
pylab.draw()
toc = time.time()
timings.append(toc-tic)
pylab.clf()
pylab.plot(timings)
pylab.title('elapsed time per iteration')
pylab.ioff()
pylab.show()
Run Code Online (Sandbox Code Playgroud)
请注意,我在运行循环之前生成图像,并且我唯一的部分是imshow
和draw
函数.我得到的结果如下:
我怎样才能避免这种放缓?
我定义了以下函数:
ex 1 x = 1
ex 0 x = 0
ex b x = b ** x
Run Code Online (Sandbox Code Playgroud)
然后,当我执行以下操作时:
1 `ex` (sum [1..])
Run Code Online (Sandbox Code Playgroud)
它试图计算无限序列的总和,而不是懒惰和返回1.为什么?
编辑:经过进一步调查,我发现如果我ex
在文件中定义函数会发生懒惰,但如果我在GHCI中定义它则不会:
$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> let ex 1 x = 1
Prelude> let ex b x = b ** x
Prelude> ex 1 (sum [1..])
<interactive>: out of memory (requested 1048576 bytes)
Run Code Online (Sandbox Code Playgroud)
如果我将ex
定义拉入文件(在本例中为test.hs):
$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ …
Run Code Online (Sandbox Code Playgroud)