在Julia中,与numpy.c_等价的函数是什么?

3

嗨,我正在阅读https://nnfs.io/这本书,但是我使用的是Julia语言(这是一个自我挑战,为了更好地了解该语言并经常使用它,而不是像以前一样只用Python..)

我遇到了书中的一部分,他们自定义了一些函数,我需要在Julia中重新创建它...

来源:https://cs231n.github.io/neural-networks-case-study/

python:

N = 100 # number of points per class
D = 2 # dimensionality
K = 3 # number of classes
X = np.zeros((N*K,D)) # data matrix (each row = single example)
y = np.zeros(N*K, dtype='uint8') # class labels
for j in range(K):
  ix = range(N*j,N*(j+1))
  r = np.linspace(0.0,1,N) # radius
  t = np.linspace(j*4,(j+1)*4,N) + np.random.randn(N)*0.2 # theta
  X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
  y[ix] = j
# lets visualize the data:
plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
plt.show()

目前我的 julia 版本如下...

N = 100 # Number of points per class
D = 2   # Dimensionality
K = 3   # Number of classes

X = zeros((N*K, D))
y = zeros(UInt8, N*K)


# See https://docs.julialang.org/en/v1/base/math/#Base.range

for j in range(0,length=K)
    ix = range(N*(j), length = N+1)
    
    radius = LinRange(0.0, 1, N)
    theta = LinRange(j*4, (j+1)*4, N) + randn(N)*0.2
    X[ix] = ????????

end

注意 ??????? 区域,因为我现在正在尝试解密是否有Julia等效的这个numpy函数。

https://numpy.org/doc/stable/reference/generated/numpy.c_.html

任何帮助都将不胜感激。或者告诉我是否需要自己编写代码。


1
你可以尝试编写一个 for 循环来实现你想要的功能,而不是寻找一个函数。有时候直接的方法是最好的。 - Andrej Oskin
2个回答

5

这是一个特殊的对象,用于提供列连接的简洁语法。在Julia中,这个功能已经内置在语言中,因此您可以这样做:

julia> a=[1,2,3];        
                         
julia> b=[4,5,6];        
                                                
julia> [a b]             
3×2 Matrix{Int64}:       
 1  4                    
 2  5                    
 3  6                                          

对于你的情况,np.c_[r*np.sin(t), r*np.cos(t)] 的儒略日等价形式应该是:

[r .* sin.(t)  r .* cos.(t)]

为了理解Python的动机,您还可以看一下:numpy.r_不是函数。它是什么?

太棒了!一旦我解决了其他问题,我想我就准备好了!谢谢你的提醒。 - Erik
1
从技术上讲,这与 np.c_ 不同,它沿第二轴连接,而不是最后一轴。但如果您的数组最多为2D,则没问题。 - BallpointBen
根据文档,@BallpointBen,np.c_ 只能沿第二轴工作。你可能在想 np.r_。https://numpy.org/doc/stable/reference/generated/numpy.c_.html“将切片对象转换为沿第二轴的连接。” - Erik
1
@Erik “数组在至少升级到2-D后将沿其最后一个轴堆叠…” 我认为这意味着维度最多为2的数组将沿第二个维度连接(必要时填充单例维度),但更高维度的数组将沿其最后一个轴连接。但无论如何,这对我来说都不是完全清楚的。 - BallpointBen

3
< p >等价于numpy.c_的似乎是水平连接,你可以使用hcat函数或者(例如)简单地使用[a b]进行连接。修复翻译中的其他问题后,我们最终得到:

N = 100 # Number of points per class
D = 2   # Dimensionality
K = 3   # Number of classes

X = zeros(N*K, D)
y = zeros(UInt8, N*K)

for j in range(0,length=K)
    ix = (N*j+1):(N*(j+1))
        
    radius = LinRange(0.0, 1, N)
    theta = LinRange(j*4, (j+1)*4, N) + randn(N)*0.2
    X[ix,:] .= [radius.*sin.(theta) radius.*cos.(theta)]
    y[ix] .= j
end
# visualize the data:
using Plots
scatter(X[:,1], X[:,2], zcolor=y, framestyle=:box)

resulting spiral plot


1
哇..我已经接受了其他答案..但是您不仅为我的第一个问题提供了解决方案..而且还解决了这个问题https://stackoverflow.com/questions/68228564/error-attempting-to-index-using-unitrange-on-vector-in-julia 随时在那里发布,我会接受那个答案 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接