What do you mean by "empty"? In numpy, usually empty means "one or more of the dimensions has extent 0". If you really mean it should have dimensions 3x4, then zeros or ones is the way to go. It would be unusual in numpy to allocate an array without initializing the content—but as I have just this second learned from matt's comment, there is a function empty that will do it.
Both of those reasons are somewhat incorrect. If 0 is important, than you don't want an array of random values. Even c++ will initialize arrays depending on compiler options. So if you have a special value you should initialize the array to a set of valid values. Also, changing the type seems irrelevant to whether or not it was initialized.
zerosoronesis the way to go. It would be unusual in numpy to allocate an array without initializing the content—but as I have just this second learned from matt's comment, there is a functionemptythat will do it.empty(), tryfull(). That lets you specify the initial value.